UnicodeDecodeError:'ascii'编解码器无法解码位置2中的字节0xd1:序号不在范围内(128)

我正在尝试使用非常大的数据集,其中包含一些非标准字符。 我需要使用unicode,根据工作规范,但我很困惑。 (很可能这样做是错的。)

我打开CSV使用:

15 ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"') 

然后,我试图用下面的代码进行编码:

 name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23]) 

我编码除lat和lng之外的所有东西,因为那些需要被发送到一个API。 当我运行程序parsing数据集到我可以使用的时候,我得到以下的回溯。

 Traceback (most recent call last): File "push_into_db.py", line 80, in <module> main() File "push_into_db.py", line 74, in main district_map = buildDistrictSchoolMap() File "push_into_db.py", line 32, in buildDistrictSchoolMap county=row[25].encode('utf-8'), lat=row[22], lng=row[23]) UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128) 

我想我应该告诉你,我正在使用python 2.7.2,这是在django 1.4上构build的应用程序的一部分。 我已经阅读了关于这个主题的几篇文章,但是没有一篇似乎直接适用。 任何帮助将不胜感激。

您可能还想知道导致问题的一些非标准字符是?并且可能是?

Unicode不等于UTF-8。 后者只是前者的编码

你这样做是错误的。 您正在读取 UTF-8 编码的数据,因此您必须将UTF-8编码的string解码为一个Unicodestring。

所以,只要用.encodereplace.encode ,它就可以工作(如果你的.csv是UTF-8编码的话)。

尽pipe如此,没有什么可以感到羞耻的。 我敢打赌,五分之一的程序员中,有三分之一的人一开始就不了解这个,如果不是更多的话)

更新:如果你的input数据不是 UTF-8编码的,那么你必须用适当的编码解码.decode() ,当然。 如果什么都没有给出,Python会假设ASCII,这显然在非ASCII字符上失败。

只需在代码中添加以下几行即可:

 import sys reload(sys) sys.setdefaultencoding('utf-8') 

错误的主要原因是由python假定的默认编码是ASCII。 因此,如果由encode('utf8')编码的string数据包含在ASCII范围之外的字符,例如像'hgvcj터파크387'这样的string,python会抛出错误,因为该string不是预期的编码格式。

如果你使用的是早于3.5版本的python版本,那么一个可靠的解决方法就是将python假定的默认编码设置为utf8

 import sys reload(sys) sys.setdefaultencoding('utf8') name = school_name.encode('utf8') 

通过这种方式,python可以预测string内的字符,这些字符会超出ASCII范围。

但是,如果您使用python版本3.5或更高版本,reload()函数不可用,所以你将不得不解决它使用解码

 name = school_name.decode('utf8').encode('utf8') 

为Python 3用户。 你可以做

 with open(csv_name_here, 'r', encoding="utf-8") as f: #some codes 

它也适用于烧瓶:)