在Python中打开文本文件有两种方法:
f = open(filename)
和
import codecs
f = codecs.open(filename, encoding="utf-8")
什么情况下codecs.open
比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字符的字节字符串。
发布于 2011-03-10 02:57:58
当您需要打开具有特定编码的文件时,可以使用codecs
模块。
发布于 2011-03-10 02:59:37
当您正在处理文本文件并希望将其透明地编码和解码为Unicode对象时。
https://stackoverflow.com/questions/5250744
复制相似问题