Python 3:将新行沿 unicode 写入文本文件

Python 3: Issue writing new lines along side unicode to text file

我 运行 在 python 中写入文本文件的 header 时遇到问题 3. 我有一个包含 unicode 和换行符的 header。以下是一个最小的工作示例:

with open('my_log.txt', 'wb') as my_file:
    str_1 = '\u2588\u2588\u2588\u2588\u2588\n\u2588\u2588\u2588\u2588\u2588'
    str_2 = 'regular ascii\nregular ascii'
    my_file.write(str_1.encode('utf8'))
    my_file.write(bytes(str_2, 'UTF-8'))

上面的工作,除了输出文件没有新行(基本上看起来我用''替换了'\n')。像下面这样:

████████regular asciiregular ascii

我期待:

████
████
regular ascii
regular ascii

基于类似的问题,我尝试用 u'\u000A' 和其他字符替换 '\n' - 但我得到了相同的结果。

另一个可能相关的问题:我知道使用上述编码和字节方法让我的生活变得更加艰难。仍然习惯在 py3 中使用 unicode,所以任何有关这方面的建议都很好,谢谢!

编辑 基于 Ignacio 的回应和一些更多的研究:以下似乎产生了预期的结果(基本上从 '\n' 转换为 '\r\n' 并确保所有行的编码都是正确的):

with open('my_log.txt', 'wb') as my_file:
    str_1 = '\u2588\u2588\u2588\u2588\u2588\r\n\u2588\u2588\u2588\u2588\u2588'
    str_2 = '\r\nregular ascii\r\nregular ascii'
    my_file.write(str_1.encode('utf8'))
    my_file.write(str_2.encode('utf8'))

'wb'

文件以二进制模式打开。因此 \n 不会被翻译成原生换行符格式。如果您在不将 LF 视为换行符的文本编辑器中打开文件,则所有文本将在编辑器中显示在一行中。使用适当的编码以文本模式打开文件,或者在写入之前手动翻译换行符。

自从您在 Python 3 上提到需要使用 Unicode 的建议...

您可能正在使用 Windows,因为 \n 在二进制模式下无法正常工作。 Linux 对文本使用 \n 行结尾,但 Windows 使用 \r\n

以文本模式打开文件并声明您想要的编码,然后写入Unicode 字符串即可。下面是一个包含不同 Unicode 转义码的示例:

#coding:utf8
str_1 = '''\
\u2588\N{FULL BLOCK}\U00002588█
regular ascii'''

with open('my_log.txt', 'w', encoding='utf8') as my_file:
    my_file.write(str_1)

您可以使用四位转义符 \uxxxx、八位转义符 \Uxxxxxxxx 或 Unicode 代码点 \N{codepoint_name}。 Unicode 字符也可以直接在文件中使用,只要存在 #coding: 声明并且源代码文件以声明的编码保存。

请注意,Python 3 的默认源编码是 utf8,因此我在上面使用的声明是可选的,但在 Python 2 上,默认是 ascii。源编码不必与用于打开文件的编码相匹配。

使用wwt 来编写文本(t 是默认值)。在 Windows \n 将在文本模式下转换为 \r\n