如何在Python2.x上打开UTF-16文件?
我正在开发一个Python工具,它必须能够打开UTF-8和UTF-16编码的文件。在Python 3.2中,我使用以下代码尝试使用UTF-8打开文件,如果出现unicode错误,则使用UTF-16进行尝试:如何在Python2.x上打开UTF-16文件?,python,unicode,Python,Unicode,我正在开发一个Python工具,它必须能够打开UTF-8和UTF-16编码的文件。在Python 3.2中,我使用以下代码尝试使用UTF-8打开文件,如果出现unicode错误,则使用UTF-16进行尝试: def readGridFromPath(self, filepath): try: self.readGridFromFile(open(filepath,'r',encoding='utf-8')) except UnicodeDecodeError:
def readGridFromPath(self, filepath):
try:
self.readGridFromFile(open(filepath,'r',encoding='utf-8'))
except UnicodeDecodeError:
self.readGridFromFile(open(filepath,'r',encoding='utf-16'))
(readGridFromFile
将一直运行到完成,或引发UnicodeDecodeError
)
但是,当我在Python 2.x中运行此代码时,我得到:
TypeError: 'encoding' is an invalid keyword argument for this function
我在文档中看到,Python2.x的
open()
没有encoding
关键字。有什么方法可以让我的代码与Python 2.x兼容吗?io.open
是您需要的替代品,因此您提供的代码示例在Python 2.x中如下所示:
import io
def readGridFromPath(self, filepath):
try:
self.readGridFromFile(io.open(filepath, 'r', encoding='utf-8'))
except UnicodeDecodeError:
self.readGridFromFile(io.open(filepath, 'r', encoding='utf-16'))
详细描述了io.open。其原型是: io.open(文件,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True)
io
模块本身被设计为Python2.x和Python3.x之间的兼容层,以简化到Py3k的转换,并简化现有Python2.x代码的后移植和维护
另外,请注意,使用编解码器时可能会有一个警告。打开,如下所示:
注意:文件始终以二进制模式打开,即使未指定二进制模式。这样做是为了避免由于使用8位值编码而导致的数据丢失。这意味着在读写时不会自动转换“\n”
此外,您可能会遇到手动检测和剥离UTF8 BOM-编解码器的问题。open
将UTF8 BOM作为u'\ufeff'
字符保留为内联。很好的调用,io。open
是更好的选择。然而,codecs.open
的缺点并不足以称之为“不合适”,我想。顺便说一句,关于codecs.open
没有正确处理BOM的说法是错误的(我试过了)。但是,关于它不能自动转换换行符的事情是正确的(但这似乎是唯一的区别)。我现在再次尝试了这一点-对于UTF-16 be/LE,它工作得很好,但是对于UTF8,它的BOM(EB BB BF)在解码文本中保留为u'\ubeff'。我清楚地记得我在Windows上使用.decode()
对BOM进行解码时遇到问题,但我现在无法测试它。我已经修复了公平性声明。\ufeff是BOM(UTF-8中的EF BB BF),并且“UTF-8-sig”编解码器将检测并剥离它(如果存在),UTF-16编码文本的“utf16”也是如此“utf-16le”和“utf-16be”假设没有BOM,也不会删除它。@MarkTolonen,嗯,似乎欺骗了我,因为它说EB BB BF(235 187 191)是UTF8 BOM。