Blo*_*nor 84 python unicode codec
有两种方法可以在Python中打开文本文件:
f = open(filename)
Run Code Online (Sandbox Code Playgroud)
和
import codecs
f = codecs.open(filename, encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)
何时比较codecs.open好open?
Luc*_*lho 79
从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()显式编码,或open()使用Python 3中的显式编码.这样做意味着您可以正确使用解码Unicode,或立即获得错误,使调试更容易.
纯ASCII"纯文本"是遥远过去的神话.正确的英文文本使用卷曲引号,em-dashes,子弹,€(欧元符号)甚至分音符(¨).别天真!(让我们不要忘记Façade的设计模式!)
因为纯ASCII不是一个真正的选项,open()没有显式编码只对读取二进制文件有用.
Ada*_*kin 20
就个人而言,我总是使用,codecs.open除非明确确定需要使用open**.原因是,当我被utf-8输入潜入我的程序时,已经被咬过很多次了."哦,我只知道它总是ascii"往往是一个经常被打破的假设.
假设'utf-8'作为默认编码在我的经验中往往是一个更安全的默认选择,因为ASCII可以被视为UTF-8,但反之则不然.在那些我确实知道输入是ASCII的情况下,我仍然这样做,codecs.open因为我坚信"明确比隐含更好".
** - 在Python 2.x中,因为Python 3中的问题状态的注释open取代了codecs.open
在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)
Run Code Online (Sandbox Code Playgroud)
所以这里显然你要么在utf-8中显式编码你的unicode字符串,要么你用codecs.open它透明地为你做.
如果你只使用字节串,那么没有问题:
>>> example = '??? ?????? ????????'
>>> open('sample.txt', 'w').write(example)
>>>
Run Code Online (Sandbox Code Playgroud)
它涉及的内容比这更多,因为当您将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)
Run Code Online (Sandbox Code Playgroud)
关于输入/输出的字符串的建议通常是"尽可能早地转换为unicode并尽可能晚地转换为字节串".使用codecs.open允许您非常轻松地完成后者.
请注意,您要为其提供unicode字符串,而不是可能具有非ASCII字符的字节串.
当您想要加载二进制文件时,请使用
f = io.open(filename, 'b').
要打开文本文件,请始终使用f = io.open(filename, encoding='utf-8')显式编码。
然而,在python 3open中,它做同样的事情,io.open并且可以替代使用。
注意:
codecs.open计划在python 2.6中引入后弃用并替换为. 只有当代码需要与早期的 python 版本兼容时我才会使用它。有关 python 中的编解码器和 unicode 的更多信息,请参阅Unicode HOWTO。io.open
codecs.open我想,这只是Python 2内置开放式接口界面更简单,功能更少的时代的残余。在Python 2中,内建open函数不带编码参数,因此,如果要使用二进制模式或默认编码以外的其他方式,则应使用codecs.open。
在中Python 2.6,io模块有助于使事情更简单。根据官方文件
New in version 2.6.
The io module provides the Python interfaces to stream handling.
Under Python 2.x, this is proposed as an alternative to the
built-in file object, but in Python 3.x it is the default
interface to access files and streams.
Run Code Online (Sandbox Code Playgroud)
话虽如此,我codecs.open在当前场景中唯一想到的用途是向后兼容。在所有其他情况下(除非您使用的是Python <2.6),最好使用io.open。也Python 3.x io.open与built-in open
注意:
codecs.open和之间也存在语法上的差异io.open。
codecs.open:
open(filename, mode='rb', encoding=None, errors='strict', buffering=1)
Run Code Online (Sandbox Code Playgroud)
io.open:
open(file, mode='r', buffering=-1, encoding=None,
errors=None, newline=None, closefd=True, opener=None)
Run Code Online (Sandbox Code Playgroud)