首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python语言中open和codecs.open的区别

Python语言中open和codecs.open的区别
EN

Stack Overflow用户
提问于 2011-03-10 02:56:27
回答 7查看 80.6K关注 0票数 115

在Python中打开文本文件有两种方法:

代码语言:javascript
复制
f = open(filename)

代码语言:javascript
复制
import codecs
f = codecs.open(filename, encoding="utf-8")

什么情况下codecs.openopen更可取

EN

回答 7

Stack Overflow用户

发布于 2014-03-10 06:13:24

从Python2.6开始,一个好的做法是使用io.open(),它也接受一个encoding参数,就像现在已经过时的codecs.open()一样。在Python3中,io.open是内置open()的别名。因此,io.open()可以在Python2.6和所有更高版本中工作,包括Python3.4。请参阅文档:http://docs.python.org/3.4/library/io.html

现在,对于原始问题:当在Python2中读取text (包括“纯文本”,超文本标记语言,XML和JSON)时,你应该始终使用显式编码的io.open(),或者在Python3中使用显式编码的open()。这样做意味着你可以正确地解码Unicode,或者马上就会出错,这使得调试变得更加容易。

纯ASCII“纯文本”是一个来自遥远过去的神话。正确的英文文本使用大引号、破折号、项目符号、欧元(欧元符号),甚至分隔符(¨)。别天真了!(我们不要忘记Façade设计模式!)

因为纯ASCII不是真正的选项,没有显式编码的open()是,对于读取二进制文件很有用。

票数 88
EN

Stack Overflow用户

发布于 2012-11-02 00:14:34

就我个人而言,除非明确需要使用open**,否则我总是使用codecs.open。原因是有太多次我被utf-8输入偷偷地放入我的程序中。“哦,我只知道它永远是ascii”,这是一个经常被打破的假设。

根据我的经验,假设'utf-8‘作为默认编码往往是一个更安全的默认选择,因为ASCII可以被视为UTF-8,但反之亦然。在这些情况下,当我确实知道输入是ASCII码时,我仍然会使用codecs.open,因为我是"explicit is better than implicit"的坚定支持者。

** -在Python2.x中,正如Python3中的问题注释所述,open取代了codecs.open

票数 21
EN

Stack Overflow用户

发布于 2013-11-13 02:16:03

在Python 2中,有unicode字符串和字节字符串。如果你只使用字节串,你可以读/写一个用open()打开的文件。毕竟,字符串只是字节。

比方说,当您有一个unicode字符串并执行以下操作时,问题就出现了:

代码语言:javascript
复制
>>> example = u'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

显然,在这里,您要么显式地以utf-8对unicode字符串进行编码,要么使用codecs.open透明地为您完成此操作。

如果你只使用字节串,那么没问题:

代码语言:javascript
复制
>>> example = 'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
>>>

它比这复杂得多,因为当您将unicode和bytestring字符串与+操作符连接在一起时,您会得到一个unicode字符串。很容易被它咬到。

此外,codecs.open不喜欢传入非ASCII字符的字节串:

代码语言:javascript
复制
codecs.open('test', 'w', encoding='utf-8').write('Μου αρέσει')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/codecs.py", line 691, in write
    return self.writer.write(data)
  File "/usr/lib/python2.7/codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)

关于输入/输出字符串的建议通常是“尽早转换为unicode,并尽可能晚地转换回字节字符串”。使用codecs.open可以非常容易地完成后一项工作。

只是要小心,你给它的是unicode字符串,而不是可能包含非ASCII字符的字节字符串。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5250744

复制
相关文章

相似问题

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