Python在写入文件时处理换行符和制表符

rmbxnbpk  于 2023-04-13  发布在  Python
关注(0)|答案(4)|浏览(214)

我写一些文本(其中包括\n\t字符)从一个源文件到一个(文本)文件;例如:
源文件(test.cpp):

/*
 * test.cpp
 *
 *    2013.02.30
 *
 */

从源文件中获取并存储在字符串变量中,如下所示
test_str = "/*\n test.cpp\n *\n *\n *\n\t2013.02.30\n *\n */\n"
当我写一个文件时

with open(test.cpp, 'a') as out:
        print(test_str, file=out)

正在编写时,换行符和制表符被转换为新行和制表符空格(就像test.cpp拥有它们一样)*,而 * 我希望它们**保持\n\t**就像test_str变量最初保存它们一样。
有没有一种方法可以在Python中实现这一点,即在不翻译这些“特殊字符”的情况下将其写入文件?

wa7juj8i

wa7juj8i1#

可以使用str.encode

with open('test.cpp', 'a') as out:
    print(test_str.encode('unicode_escape').decode('utf-8'), file=out)

这将转义所有Python识别的特殊转义字符。
举个例子:

>>> test_str = "/*\n test.cpp\n *\n *\n *\n\t2013.02.30\n *\n */\n"
>>> test_str.encode('unicode_escape')
b'/*\\n test.cpp\\n *\\n *\\n *\\n\\t2013.02.30\\n *\\n */\\n'
yi0zb3m4

yi0zb3m42#

使用replace()。由于您需要多次使用它,您可能需要查看this

test_str = "/*\n test.cpp\n *\n *\n *\n\t2013.02.30\n *\n */\n"
with open("somefile", "w") as f:
    test_str = test_str.replace('\n','\\n')
    test_str = test_str.replace('\t','\\t')
    f.write(test_str)
enyaitl3

enyaitl33#

我希望它们保持\n和\t,就像test_str变量最初保存它们一样。
test_str不包含反斜杠\ + t(两个字符)。它包含单个字符ord('\t') == 9(与test.cpp中的字符相同)。反斜杠在Python字符串字面量中是特殊的,例如,u'\U0001f600'不是 ten 个字符-它是单个字符😀Don'不要混淆运行时内存中的字符串对象和Python源代码中字符串文字的文本表示。
JSON可能是比unicode-escape编码更好的替代方案来存储文本(更便携),即用途:

import json

with open('test.json', 'w') as file:
    json.dump({'test.cpp': test_str}, file)

而不是test_str.encode('unicode_escape').decode('ascii')
回读json:

with open('test.json') as file:
    test_str = json.load(file)['test.cpp']
ppcbkaq5

ppcbkaq54#

str.encode'unicode_escape'一起使用(如Jon Clements answer中所示)不是一个好的解决方案,因为它会转义所有Unicode字符,这在与英语以外的任何字符一起使用时会产生不好的结果:

>>> t = 'English text\tTexte en Français\nنص بالعربية\t中文文本\n'
>>> t
'English text\tTexte en Français\nنص بالعربية\t中文文本\n'
>>> t.encode('unicode_escape').decode('utf-8')
'English text\\tTexte en Fran\\xe7ais\\n\\u0646\\u0635 \\u0628\\u0627\\u0644\\u0639\\u0631\\u0628\\u064a\\u0629\\t\\u4e2d\\u6587\\u6587\\u672c\\n'

正如你所看到的,ASCII以外的任何东西的显示都被转换成了转义字符,这不是预期的行为。但是你可以看到Python控制台没有这个问题,它完美地显示了非ASCII字符。
要实现类似于Python控制台的功能,请使用以下代码:

>>> repr(t).strip("'")
'English text\\tTexte en Français\\nنص بالعربية\\t中文文本\\n'

repr(t)除了在文本周围添加单引号外,其他都做得很干净,因此我们使用.strip("'")删除它们。

相关问题