使用平台相关的换行符打印到UTF-8编码的文件吗?


问题内容

在Python中,用平台相关的换行符写入UTF-8编码文件的最佳方法是什么?理想情况下,该解决方案可以在使用Python
2进行大量打印的程序中透明地工作。(也欢迎提供有关Python 3的信息!)

实际上,写入UTF-8文件的标准方法似乎是codecs.open(’name.txt’,’w’)。但是,文档表明

(…)在读写过程中不会自动对’\ n’进行转换。

因为该文件实际上是以二进制模式打开的。那么,如何使用适当的依赖于平台的换行符来写入UTF-8文件?

注意:在Windows XP上使用Python 2.6时,“
t”模式似乎确实可以完成此工作(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()具有相同的缺陷(不会编写特定于平台的行终止符)。但是内置有encodingarg的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文档相同。不同之处在于,在2.6中将“ b”附加到模式arg的“大头钉进入二进制模式” hack在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
>>>