首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印到UTF-8编码文件,与平台相关的新行?

打印到UTF-8编码文件,与平台相关的新行?
EN

Stack Overflow用户
提问于 2011-05-09 20:15:11
回答 3查看 8.7K关注 0票数 11

在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')),但这是否有文档记录并保证工作?

EN

Stack Overflow用户

回答已采纳

发布于 2011-05-09 23:24:58

假设Python2.7.1(这是您引用的文档):“wt”模式没有文档化(记录的唯一模式是'r'),而且不工作--编解码模块将'b‘附加到模式中,从而导致其失败:

代码语言:javascript
运行
复制
>>> 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:

代码语言:javascript
运行
复制
f = open('bar.text', 'w')
f.write(unicode_object.encode('utf8'))

关于Python3.x的更新

codecs.open()似乎也有同样的缺陷(不会编写特定于平台的行终止符)。但是,内置的open() (它有一个encoding arg )很乐意这样做:

代码语言:javascript
运行
复制
[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”没有被检测为无效模式,该文件是以文本模式打开的,并且看起来像您想要的那样工作,而不是文档化的:

代码语言:javascript
运行
复制
>>> 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
>>>
票数 11
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5941988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档