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

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

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

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

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

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

什么情况下codecs.openopen更可取

EN

回答 3

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用户

发布于 2011-03-10 02:57:58

当您需要打开具有特定编码的文件时,可以使用codecs模块。

票数 6
EN

Stack Overflow用户

发布于 2011-03-10 02:59:37

当您正在处理文本文件并希望将其透明地编码和解码为Unicode对象时。

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

https://stackoverflow.com/questions/5250744

复制
相关文章

相似问题

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