Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python2.x上打开UTF-16文件?_Python_Unicode - Fatal编程技术网

如何在Python2.x上打开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:

我正在开发一个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:
            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。