Python 3.x Python3:发布沿unicode向文本文件写入新行的问题

Python 3.x Python3:发布沿unicode向文本文件写入新行的问题,python-3.x,text,unicode,newline,file-writing,Python 3.x,Text,Unicode,Newline,File Writing,我在用python 3编写文本文件头时遇到了一个问题。 我有一个包含unicode和新行字符的标题。以下是最低限度的工作示例: 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.

我在用python 3编写文本文件头时遇到了一个问题。 我有一个包含unicode和新行字符的标题。以下是最低限度的工作示例:

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”,并确保所有行的编码都是正确的):

“wb”

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

“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)
您可以使用四位转义码
\uxxx
、八位转义码
\uxxxxx
,或Unicode码点
\N{codepoint\u name}
。只要存在
#coding:
声明,并且源代码文件以声明的编码保存,也可以在文件中直接使用Unicode字符

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


使用
w
wt
编写文本(
t
是默认设置)。Windows上的
\n
将以文本模式转换为
\r\n

因为您提到希望在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)
您可以使用四位转义码
\uxxx
、八位转义码
\uxxxxx
,或Unicode码点
\N{codepoint\u name}
。只要存在
#coding:
声明,并且源代码文件以声明的编码保存,也可以在文件中直接使用Unicode字符

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


使用
w
wt
编写文本(
t
是默认设置)。在Windows上,
\n
将转换为文本模式下的
\r\n

我认为最好使用编码切换到文本模式,并在需要时让Python更改
\n
。我认为最好使用编码切换到文本模式,并在需要时让Python更改
\n
。非常好有帮助-谢谢!非常有帮助-谢谢!