在 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 字符的字节字符串。