我不确切知道这个错误的来源是什么以及如何修复它。我通过运行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)
答案 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)