在 Python 中,写入具有平台相关换行符的 UTF-8 编码文件的最佳方法是什么?理想情况下,该解决方案在使用 Python 2 进行大量打印的程序中非常透明地工作。(也欢迎提供有关 Python 3 的信息!)
事实上,写入UTF-8文件的标准方式似乎是codecs.open('name.txt', 'w')。 .但是,文档表明
(…) no automatic conversion of '\n' is done on reading and writing.
因为文件实际上是以二进制方式打开的。那么,如何使用适当的平台相关换行符写入 UTF-8 文件?
注意:'t' 模式似乎在 Windows XP 上使用 Python 2.6 确实完成了工作 (codecs.open('name.txt', 'wt')),但这是否已记录并保证有效?
最佳答案
假定 Python 2.7.1(这是您引用的文档):未记录“wt”模式(记录的唯一模式是“r”),并且不起作用——编解码器模块将“b”附加到导致失败的模式:
>>> f = codecs.open('bar.txt', 'wt', encoding='utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\python27\lib\codecs.py", line 881, in open
file = __builtin__.open(filename, mode, buffering)
ValueError: Invalid mode ('wtb')
避免编解码器模块和 DIY:
f = open('bar.text', 'w')
f.write(unicode_object.encode('utf8'))
关于 Python 3.x 的更新:
看来 codecs.open() 也有同样的缺陷(不会编写特定于平台的行终止符)。然而,具有 encoding
arg 的内置 open() 很乐意这样做:
[Python 3.2 on Windows 7 Pro]
>>> import codecs
>>> f = codecs.open('bar.txt', 'w', encoding='utf8')
>>> f.write('line1\nline2\n')
>>> f.close()
>>> open('bar.txt', 'rb').read()
b'line1\nline2\n'
>>> f = open('bar.txt', 'w', encoding='utf8')
>>> f.write('line1\nline2\n')
12
>>> f.close()
>>> open('bar.txt', 'rb').read()
b'line1\r\nline2\r\n'
>>>
关于 Python 2.6 的更新
文档说的和 2.7 文档一样。不同之处在于,将“b”附加到模式 arg 的“bludgeon into binary mode”黑客攻击在 2.6 中失败,因为“wtb”未被检测为无效模式,文件以文本模式打开,并且似乎可以正常工作如您所愿,而不是记录在案:
>>> import codecs
>>> f = codecs.open('fubar.txt', 'wt', encoding='utf8')
>>> f.write(u'\u0a0aline1\n\xffline2\n')
>>> f.close()
>>> open('fubar.txt', 'rb').read()
'\xe0\xa8\x8aline1\r\n\xc3\xbfline2\r\n' # "works"
>>> f.mode
'wtb' # oops
>>>
关于python - 打印到 UTF-8 编码文件,使用平台相关的换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5941988/