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

标签 python text utf-8 newline codec

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

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

(…) no automatic conversion of '\n' is done on reading and writing.

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

注意:'t' 模式似乎在 Windows XP 上使用 Python 2.6 确实完成了工作 (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() 也有同样的缺陷(不会编写特定于平台的行终止符)。然而,具有 encoding arg 的内置 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 文档一样。不同之处在于,将“b”附加到模式 arg 的“bludgeon into binary mode”黑客攻击在 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
>>>

关于python - 打印到 UTF-8 编码文件,使用平台相关的换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5941988/

相关文章:

python - 检索文件路径的尾端

python - 将文本文件的编码从 utf-8 转换为 python 中的 ansi 或 unicode

php - 来自命令行的瑞典字符的utf8问题

java - UTF-8 编码不适用于 Eclipse Java 应用程序

.net - StreamReader.ReadToEnd()使用什么字符编码?

python - turtle : shifting on the y axis using a for loop

python - Django - 最后插入 ID

python - cx_Oracle 数据库清理过度减慢查询

Android 如何使用 Intent 发送文本和图像或任何对象?

text - 如何对某个程序的输出进行列化?