打印到UTF-8编码文件,使用平台相关的换行符?
在Python中,写入一个使用UTF-8编码的文件,并且能根据不同平台自动处理换行符,最好的方法是什么呢?理想情况下,这个解决方案应该能在一个经常打印的Python 2程序中顺利工作。(关于Python 3的信息也欢迎提供!)
实际上,写入UTF-8文件的标准方法似乎是codecs.open('name.txt', 'w')。不过,文档中提到:
(…) 在读取和写入时不会自动转换'\n'。
这是因为文件实际上是以二进制模式打开的。那么,如何才能在写入UTF-8文件时,正确处理不同平台的换行符呢?
注意:在Windows XP上,使用't'模式似乎确实能解决这个问题(codecs.open('name.txt', 'wt')),但这个方法有文档说明并且保证有效吗?
3 个回答
在Python 2中,为什么不需要明确地进行编码呢?
with open('myfile.txt', 'w') as f:
print >> f, some_unicode_text.encode('UTF-8')
无论是代码中嵌入的换行符,还是通过print
输出的换行符,都会自动转换成适合当前操作系统的换行符。
你在找 os.linesep
吗?可以查看这个链接了解更多信息:http://www.python.org/doc//current/library/os.html#os.linesep
假设你在用的是 Python 2.7.1(这是你引用的文档版本):'wt' 模式没有被记录(唯一被记录的模式是 'r'),而且这个模式是不能用的——因为 codecs 模块会在模式后面加上 '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')
最好别用 codecs 模块,自己动手做:
f = open('bar.text', 'w')
f.write(unicode_object.encode('utf8'))
更新关于 Python 3.x:
看起来 codecs.open() 也有同样的问题(不能写入特定平台的行结束符)。不过内置的 open() 函数有一个 encoding
参数,可以正常工作:
[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 中,"bludgeon into binary mode" 的方法(在模式参数后面加上 "b")没有成功,因为 "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
>>>