我正在开发一个必须能够打开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.x的open()
没有encoding
个关键字。有什么方法可以让我使我的代码Python 2.x兼容吗?
答案 0 :(得分: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
详细描述了here。它的原型是:
io.open( file,mode ='r',buffering = -1, encoding = None ,errors = None,newline = None,closefd = True )
io
模块本身被设计为Python 2.x和Python 3.x之间的兼容层,以便于过渡到Py3k并简化现有Python 2.x代码的反向移植和维护。
此外,请注意使用codecs.open
可能会有警告,it works in binary mode only:
注意:即使未指定二进制模式,文件也始终以二进制模式打开。这样做是为了避免因使用8位值进行编码而导致数据丢失。这意味着在读写时不会自动转换'\ n'。
此外,您可能会遇到手动检测和剥离UTF8 BOM的问题 - codecs.open
将UTF8 BOM内联为u'\ufeff'
字符。