Python是否能够从文件中读取非ASCII文本?

3

我有一个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")不会起作用,因为错误发生在读入这一行之前。


您可以使用Python 3+,它本身支持Unicode。 - Serdalis
@Serdalis:他正在使用Python 3。看一下回溯跟踪。 - abarnert
@abarnert 没有注意到,抱歉。 - Serdalis
2个回答

7

有两个选择。

  1. 在打开文件时指定编码,而不是使用默认值。
  2. 以二进制模式打开文件,并显式地从bytes解码为str

显然,第一个选择更简单。您没有展示如何打开文件,但假设您的代码看起来像这样:

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:

就是这样。

正如文档所解释的那样,如果在文本模式下没有指定编码:

默认编码取决于平台(即locale.getpreferredencoding()返回的内容),但 Python 支持的任何编码都可以使用。

在某些情况下(例如任何 OS X 或经过适当配置的 linux),locale.getpreferredencoding()将始终为“UTF-8”。但显然它永远不会“自动选择正确的文件编码”。因此,如果您知道文件是 UTF-8,请明确指定它。


2

对于 Python 2 和 3 解决方案,请使用codecs模块:

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

for line in file_obj:
    ...

否则 -- Python 3 -- 使用abarnert的解决方案

为什么要使用codecs,当普通的open可以做同样的事情? - abarnert
@abarnert:我想应该可以在Python 2和Python 3上运行。 - dawg
1
实际上,它们并不完全相同。codecs 在解码之前执行其换行符操作,而 io.TextIOWrapper(即 open 返回的内容)则在解码之后执行。因此,通用换行符与 codecs.open 不兼容。这也是为什么 codecs.open 没有被弃用的原因之一——因为存在依赖于错误通用换行符的代码。 (尽管每年至少会提出废弃它的想法...) - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接