在Python中,用平台相关的换行符编写UTF-8编码文件的最佳方式是什么?理想情况下,这个解决方案在一个在Python 2中进行大量打印的程序中非常透明地工作。(关于Python 3的信息也是受欢迎的!)
实际上,编写UTF-8文件的标准方式似乎是codecs.open('name.txt', 'w')。然而,这些文档表明
(…)在读写时不进行“\n”的自动转换。
因为文件实际上是以二进制模式打开的。那么,如何用适当的平台相关的换行符写入UTF-8文件呢?
注意:在Windows上使用Python2.6时,“t”模式似乎实际上完成了工作(codecs.open(‘name.txt,'wt')),但这是否有文档记录并保证工作?
发布于 2011-05-09 23:24:58
假设Python2.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'))关于Python3.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'
>>>关于Python2.6的更新
医生说的和2.7的一样。不同之处在于,将"b“添加到模式arg的”进入二进制模式“的攻击在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
>>>发布于 2011-05-09 21:34:11
你在找os.linesep吗?http://www.python.org/doc//current/library/os.html#os.linesep
发布于 2011-05-10 12:19:46
在Python 2中,为什么不显式地编码呢?
with open('myfile.txt', 'w') as f:
print >> f, some_unicode_text.encode('UTF-8')嵌入的换行符和print发出的新行都将转换为适当的平台换行符。
https://stackoverflow.com/questions/5941988
复制相似问题