Python 打印到UTF-8编码文件,是否使用平台相关的换行符?
在Python中,使用平台相关换行符写入UTF-8编码文件的最佳方式是什么?理想情况下,该解决方案在Python2中进行大量打印的程序中可以非常透明地工作。(也欢迎提供有关Python 3的信息!) 事实上,写入UTF-8文件的标准方式似乎是。然而,文件表明: (…)在读写时没有自动转换“\n” 因为文件实际上是以二进制模式打开的。那么,如何使用适当的平台相关换行符写入UTF-8文件呢Python 打印到UTF-8编码文件,是否使用平台相关的换行符?,python,text,utf-8,newline,codec,Python,Text,Utf 8,Newline,Codec,在Python中,使用平台相关换行符写入UTF-8编码文件的最佳方式是什么?理想情况下,该解决方案在Python2中进行大量打印的程序中可以非常透明地工作。(也欢迎提供有关Python 3的信息!) 事实上,写入UTF-8文件的标准方式似乎是。然而,文件表明: (…)在读写时没有自动转换“\n” 因为文件实际上是以二进制模式打开的。那么,如何使用适当的平台相关换行符写入UTF-8文件呢 注意:在Windows XP上,使用Python 2.6的“t”模式(codecs.open('name.tx
注意:在Windows XP上,使用Python 2.6的“t”模式(codecs.open('name.txt,'wt'))似乎确实可以完成这项工作,但这是否有文档记录并保证可以正常工作?您正在寻找
os.linesep
假设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')
更新关于Python 3.x:
似乎codecdes.open()也有同样的缺陷(不会编写特定于平台的行终止符)。但是,内置的open()具有编码
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文档的内容相同。不同之处在于,在2.6中,将“b”附加到模式参数的“bludgeon to binary mode”黑客攻击失败,因为“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 2中,为什么不显式编码
with open('myfile.txt', 'w') as f:
print >> f, some_unicode_text.encode('UTF-8')
嵌入的换行符和由
print
发出的换行符都将转换为相应的平台换行符。@eyquem:两者都有,但尤其是Python 2,因为这是我大部分时间使用的版本。:)@约翰:谢谢。Python3方法非常好。至于Python2方法,对于包含大量输出的程序来说,这是一个真正的难题。奇怪的是,codecdes.open()在Windows上与我的Python 2.6的“wt”一起工作…@EOL:请参阅我的最新更新re 2.6。也许你可以通过一个包装器来避免“真正的痛苦”…@约翰:最好在你的Python 2解决方案中提到f=codecs.getwriter(“utf-8”)(f)
,因为问题是“一个需要大量打印的程序”,因此,打印时自动编码很有用。@John:您认为有什么理由在Python 3中使用codecs.open()
而不是open()??(2) 无用的向后兼容uselessA打印战利品是在程序中完成的,所以我希望看到一个轻量级的解决方案。另外,我想知道是否可以保证文本模式在某些平台上不会截断为7位…
with open('myfile.txt', 'w') as f:
print >> f, some_unicode_text.encode('UTF-8')