在Python中,使用与平台相关的换行符写入UTF-8编码文件的最佳方法是什么?理想情况下,该解决方案在Python 2中进行大量打印的程序中非常透明地工作。(有关Python 3的信息也很受欢迎!)
事实上,写入UTF-8文件的标准方式似乎是codecs.open('name.txt', 'w')。但是,文档表明
(...)在阅读和写作时不会自动转换'\ n'。
因为文件实际上是以二进制模式打开的。那么,如何使用适当的平台相关换行符写入UTF-8文件?
注意:“t”模式似乎实际上是在Windows XP上使用Python 2.6完成工作(codecs.open('name.txt','wt')),但这是否有记录并保证可以正常工作?
答案 0 :(得分:11)
假设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()具有相同的缺陷(不会编写特定于平台的行终止符)。但是内置的open()有一个encoding
arg,很乐意这样做:
[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文档相同。不同之处在于,对于模式arg附加“b”的“大棒进入二进制模式”黑客在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
>>>
答案 1 :(得分:4)
您在寻找os.linesep
吗? http://www.python.org/doc//current/library/os.html#os.linesep
答案 2 :(得分:0)
在Python 2中,为什么不明确编码?
with open('myfile.txt', 'w') as f:
print >> f, some_unicode_text.encode('UTF-8')
嵌入的换行符和print
发出的换行符都将转换为相应的平台换行符。