Python是否可以从文件中读取非ascii文本?

时间:2013-03-19 23:53:35

标签: python ascii decode

我有一个UTF-8格式的.txt文件,并且在将其读入Python时遇到问题。我有大量的文件,转换会很麻烦。

所以,如果我通过

读取文件
for line in file_obj:
    ...

我收到以下错误:

  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 291: ordinal not in range(128)

我猜x.decode("utf-8")不起作用,因为错误发生在甚至读入行之前。

2 个答案:

答案 0 :(得分:7)

有两种选择。

  1. 在打开文件时指定编码,而不是使用默认值。
  2. 以二进制模式打开文件,并从decode明确bytesstr
  3. 第一个显然是更简单的一个。您没有显示如何打开文件,但假设您的代码如下所示:

    with open(path) as file_obj:
        for line in file_obj:
    

    这样做:

    with open(path, encoding='utf-8') as file_obj:
        for line in file_obj:
    

    就是这样。

    the docs所述,如果您未在文本模式中指定编码:

      

    默认编码取决于平台(无论locale.getpreferredencoding()返回什么),但可以使用Python支持的任何编码。

    在某些情况下(例如,任何OS X或具有适当配置的Linux),locale.getpreferredencoding()将始终为“UTF-8”。但它显然永远不会“自动对任何我可能打开的文件的权利”。因此,如果您知道某个文件是UTF-8,则应明确指定该文件。

答案 1 :(得分:2)

对于Python 2和3解决方案,请使用编解码器:

import codecs
file_obj = codecs.open('ur file', "r", "utf-8")

for line in file_obj:
    ...

否则 - Python 3 - 使用abarnert的solution