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。当我运行程序将数据集解析为我可以使用的内容时,我得到以下 Traceback。

 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 构建的应用程序的一部分。我已经阅读了有关此主题的几篇文章,但似乎没有一篇直接适用。任何帮助将不胜感激。

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

原文由 jelkimantis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 677
2 个回答

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

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

所以只需将 .encode 替换为 .decode ,它应该可以工作(如果你的 .csv 是 UTF-8 编码的)。

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

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

原文由 ch3ka 发布,翻译遵循 CC BY-SA 3.0 许可协议

只需将此行添加到您的代码中:

1.Python2

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

2.Python3

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

原文由 khelili miliana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题