UnicodeEncodeError:'ascii'编解码器无法编码位置0-1中的字符:序数不在范围内(128)

时间:2014-09-06 06:17:11

标签: python unicode

我不确切知道这个错误的来源是什么以及如何修复它。我通过运行this code来获取它。

 Traceback (most recent call last):
      File "t1.py", line 86, in <module>
        write_results(results)
      File "t1.py", line 34, in write_results
        dw.writerows(results)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 154, in writerows
        return self.writer.writerows(rows)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

非常感谢任何解释!

我更改了代码,现在我收到了这个错误:

 File "t1.py", line 88, in <module>
    write_results(results)
  File "t1.py", line 35, in write_results
    dw.writerows(results)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 154, in writerows
    return self.writer.writerows(rows)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

这是改变:

 with codecs.open('results.csv', 'wb', 'utf-8') as f:
        dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
        dw.writer.writerow(dw.fieldnames)
        dw.writerows(results)

2 个答案:

答案 0 :(得分:4)

这部分代码引发了错误:

with open('results.csv', 'w') as f:
    dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
    dw.writer.writerow(dw.fieldnames)
    dw.writerows(results)

您正在打开一个ASCII文件,然后您正在尝试将非ASCII数据写入其中。我想那个编写该脚本的人碰巧在测试期间从未遇到过非ASCII字符,因此他从未遇到过错误。

但是如果你查看csv module的文档,你会发现模块无法正确处理Unicode字符串(这就是Beautiful Soup返回的内容),CSV文件总是必须打开二进制模式,只有UTF-8或ASCII可以安全地编写。

因此,您需要在编写之前将所有字符串编码为UTF-8。我首先想到在写入时编码字符串就足够了,但是Python 2 csv模块无论如何都会对Unicode字符串进行扼流。所以我猜除了明确编码每个字符串之外别无他法:

parse_results()中,更改行

results.append({'url': url, 'create_date': create_date, 'title': title})

results.append({'url': url, 'create_date': create_date, 'title': title.encode("utf-8")})

这可能已经足够,因为我不希望URL或日期包含非ASCII字符。

答案 1 :(得分:0)

这应该有效。为我工作。代码片段

import csv
import sys
reload(sys)
sys.setdefaultencoding('utf8')
data = [["a", "b", u'\xe9']]
with open("output.csv", "w") as csv_file:
    writer = csv.writer(csv_file, quoting=csv.QUOTE_ALL)
    writer.writerows(data)