读取文本文件时出现UnicodeDecodeError错误

5

我是Python的初学者(我使用的是3.4版本)。以下是我代码中相关的部分:

fileObject = open("countable nouns raw.txt", "rt")
bigString = fileObject.read()
fileObject.close()

无论何时我尝试读取这个文件,都会出现以下问题:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 82273: character maps to <undefined>

我一直在阅读相关资料,似乎与我的默认编码不匹配有关。在另一篇文章中,我看到可以使用以下方法以特定编码读取文件:

import codecs
f = codecs.open("file.txt", "r", "utf-8")

但是你必须事先知道它。问题是我不知道文本文件是如何编码的。一些帖子建议使用Chardet。我已经安装了它,但我不知道如何让它读取文本文件。

有什么办法可以解决这个问题吗?

4个回答

3

没有必要使用codecs.open();这是针对Python 2的建议。

在Python 3中,open()需要一个encoding参数:

fileObject = open("countable nouns raw.txt", "rt", encoding='utf8')

当然,这需要您知道文件使用了哪种编解码器。一般来说,Python很难自动判断;各种不同的文件格式可能会包含编解码器信息或者统一采用某种编解码器,但如果您只有一个通用文本文件,您将需要找出它是由什么工具创建的以及使用了哪种编解码器来写入数据。


0
除了在使用open时使用正确的Python方法来指定编码之外,您还可以尝试使用file工具获取编码。
一个包含foo.txt的文件。
ÙÚÛÜ

可以使用以下方法进行检查

$ file foo.txt 
foo.txt: UTF-8 Unicode text
$ wc foo.txt
1 1 9 foo.txt

如您使用 wc 命令所示,它包含九个字节,每个字符两个字节,一个是换行符。


在Windows上,file是否存在? - Padraic Cunningham

0

0

任何操作系统都可以使用库 chardet 检测编码方式。如果您没有此库,请确保运行 pip install chardet 进行安装。之后,这个过程就相当简单了:

import chardet
import requests
content = requests.get("http://yahoo.co.jp/").content
detect = chardet.detect(content)
print(detect)

这个库尝试检测编码是什么。这并不意味着它是100%正确的,只是它很可能是正确的。然后你可以直接读取文件:

open('file.txt', encoding=detect['encoding'])

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