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
。源编码不必与用于打开文件的编码相匹配。
使用w
或wt
来编写文本(t
是默认值)。在 Windows \n
将在文本模式下转换为 \r\n
。
我 运行 在 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
。源编码不必与用于打开文件的编码相匹配。
使用w
或wt
来编写文本(t
是默认值)。在 Windows \n
将在文本模式下转换为 \r\n
。