14

我正在开发一个必须能够打开 UTF-8 和 UTF-16 编码文件的 Python 工具。在 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

我在文档中看到 Python 2.xopen()没有encoding关键字。有什么办法可以让我的代码与 Python 2.x 兼容?

4

1 回答 1

21

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(文件,模式='r',缓冲=-1,编码=无,错误=无,换行=无,closefd=真

io模块本身被设计为 Python 2.x 和 Python 3.x 之间的兼容层,以简化向 Py3k 的过渡并简化现有 Python 2.x 代码的反向移植和维护。

另外,请注意使用 可能有一个警告codecs.open,因为它在二进制模式下工作

注意:文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免由于使用 8 位值进行编码而导致的数据丢失。这意味着在读写时不会自动转换 '\n'`。

此外,您可能会遇到手动检测和剥离 UTF8 BOM 的问题——codecs.open将 UTF8 BOM 内联保留为u'\ufeff'字符。

于 2012-04-07T21:57:46.227 回答