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

2024-03-28 10:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用一个非常大的数据集,其中包含一些非标准字符。我需要使用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和液化天然气,我对所有东西都进行编码,因为它们需要发送到API。当我运行程序将数据集解析为我可以使用的内容时,我得到以下回溯。

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)

我想我应该告诉你我使用的是Python2.7.2,这是在Django1.4上构建的应用程序的一部分。我读过几篇关于这个话题的文章,但似乎没有一篇是直接适用的。任何帮助都将不胜感激。

您可能还想知道,导致该问题的一些非标准字符是~,可能是~。


Tags: csv数据inpydbline字符push
3条回答

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

你这样做是不对的。您正在读取编码的UTF-8-数据,因此必须将UTF-8编码的字符串解码为unicode字符串。

所以只要用.decode替换.encode,它就应该工作了(如果您的.csv是UTF-8编码的)。

不过,没什么好羞愧的。我敢打赌,五分之三的程序员一开始很难理解这一点,如果不是更多的话;)

更新: 如果您的输入数据是而不是UTF-8编码的,那么您当然必须使用适当的编码。如果没有给出任何内容,python将采用ASCII,这显然会在非ASCII字符上失败。

对于Python 3用户。你可以的

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

它也适用于烧瓶:)

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

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

相关问题 更多 >