在Python中打开文本文件有两种方法:
f = open(filename)和
import codecs
f = codecs.open(filename, encoding="utf-8")什么情况下codecs.open比open更可取
发布于 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()是,对于读取二进制文件很有用。
发布于 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
发布于 2013-11-13 02:16:03
在Python 2中,有unicode字符串和字节字符串。如果你只使用字节串,你可以读/写一个用open()打开的文件。毕竟,字符串只是字节。
比方说,当您有一个unicode字符串并执行以下操作时,问题就出现了:
>>> 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透明地为您完成此操作。
如果你只使用字节串,那么没问题:
>>> example = 'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
>>>它比这复杂得多,因为当您将unicode和bytestring字符串与+操作符连接在一起时,您会得到一个unicode字符串。很容易被它咬到。
此外,codecs.open不喜欢传入非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)关于输入/输出字符串的建议通常是“尽早转换为unicode,并尽可能晚地转换回字节字符串”。使用codecs.open可以非常容易地完成后一项工作。
只是要小心,你给它的是unicode字符串,而不是可能包含非ASCII字符的字节字符串。
https://stackoverflow.com/questions/5250744
复制相似问题