读取文本文件时出现UnicodeDecodeError

时间:2015-06-11 09:52:53

标签: python

我是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。我安装了它,但我不知道如何让它读取文本文件。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

无需使用codecs.open();这对Python 2的建议。

在Python 3中open()采用encoding参数:

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

这确实需要您知道该文件使用的编解码器,当然。一般来说,Python并不是一个容易理解的方法;单个文件格式可能包含编解码器信息或已在给定编解码器上标准化,但如果您拥有通用文本文件,则必须弄清楚创建它的内容以及用于编写数据的编解码器。

答案 1 :(得分:0)

除了在使用open时使用正确的Python方法指定编码,您还可以尝试使用file工具获取编码。

包含

的文件foo.txt
ÙÚÛÜ

可以使用

进行检查
$ file foo.txt 
foo.txt: UTF-8 Unicode text
$ wc foo.txt
1 1 9 foo.txt

正如您使用wc所看到的,它包含九个字节,每个字符两个,一个换行符。

答案 2 :(得分: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'])