我正在尝试使用一个非常大的数据集,其中包含一些非标准字符。根据工作规范,我需要使用 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 上构建的应用程序的一部分。我已经阅读了几篇关于这个主题的帖子,但似乎没有一个直接适用。任何帮助将不胜感激。

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

最佳答案

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

你这样做是错误的。您正在读取 UTF-8 编码的数据,因此您必须将 UTF-8 编码的字符串解码为 un​​icode 字符串。

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

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

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

关于python - UnicodeDecodeError : 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10406135/

10-14 18:10
查看更多