我正在尝试使用一个非常大的数据集,其中包含一些非标准字符。根据工作规范,我需要使用 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 许可协议
Unicode 不等于 UTF-8。后者只是前者的 _编码_。
你做错了。您正在 读取 UTF-8 编码 的数据,因此您必须将 UTF-8 编码的字符串 解码 为 unicode 字符串。
所以只需将
.encode
替换为.decode
,它应该可以工作(如果你的 .csv 是 UTF-8 编码的)。不过也没什么好丢脸的。我敢打赌,五分之三的程序员一开始都很难理解这一点,如果不是更多的话;)
更新:如果您的输入数据 不是 UTF-8 编码的,那么您当然必须
.decode()
使用适当的编码。如果没有给出任何内容,python 假定 ASCII,这显然在非 ASCII 字符上失败。