Python中open和codecs.open的区别
有两种方法可以在Python中打开文本文件:
f = open(filename)
和
import codecs f = codecs.open(filename, encoding="utf-8")
codecs.open
什么时候可以open
?
从Python 2.6开始,一个好的做法是使用io.open()
,它也采用encoding
参数,就像现在已经过时的codecs.open()
。 在Python 3中, io.open
是open()
内置的别名。 所以io.open()
可以在Python 2.6和所有更高版本(包括Python 3.4)中工作。 请参阅文档: http : //docs.python.org/3.4/library/io.html
现在,对于原始问题:在Python 2中阅读文本 (包括“纯文本”,HTML,XML和JSON)时,应该始终使用显式编码方式的io.open()
,或者使用Python中的显式编码方式使用open()
3.这样做意味着你得到了正确解码的Unicode,或者直接得到一个错误,使debugging更容易。
纯ASCII的“纯文本”是遥远的过去的一个神话。 正确的英文文本使用curl的引号,时间破折号,子弹,€(欧元符号),甚至diaeresis(¨)。 不要太天真! (让我们不要忘了外观devise模式!)
由于纯ASCII不是一个真正的选项, open()
没有显式的编码只对读取二进制文件有用。
就个人而言,我总是使用codecs.open
除非明确需要使用open
**。 原因是有很多次,当我被utf-8input进入我的程序时被咬了。 “哦,我只知道它总是ascii”往往是一个常常被打破的假设。
假设'utf-8'作为默认的编码往往是一个更安全的默认select在我的经验,因为ASCII可以被视为UTF-8,但反过来是不正确的。 而在那些我确实知道input是ASCII码的情况下,我仍然在做codecs.open
因为我坚信“明确比隐含更好” 。
** – 在Python 2.x中,如Python 3中open
的问题所述的注释replacecodecs.open
在Python 2中有unicodestring和字节串。 如果你只是使用bytestrings,你可以读/写一个用open()
的文件就好了。 毕竟,string只是字节。
问题出现的时候,比方说,你有一个Unicodestring,你做了以下几点:
>>> 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)
所以这里显然你要么明确地编码你的Unicodestring在codecs.open
-8或你使用codecs.open
透明地为你做。
如果你只使用字节串,那么没有问题:
>>> example = 'Μου αρέσει Ελληνικά' >>> open('sample.txt', 'w').write(example) >>>
它比这更涉及到,因为当你使用+
运算符连接unicode和bytestringstring时,你会得到一个unicodestring。 容易被那个咬伤。
此外, codecs.open
不喜欢string传递非ASCII字符:
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)
有关input/输出string的build议通常是“尽可能早地转换为unicode,尽可能早地返回字节串”。 使用codecs.open
允许你很容易地做后者。
只要小心,你给它unicodestring,而不是可能有非ASCII字符的字节串。
当您需要打开具有特定编码的文件时,您可以使用codecs
模块。
在处理文本文件时,需要对Unicode对象进行透明编码和解码。