Python UnicodeEncodeError:&x27;ascii';编解码器可以';对位置0-1中的字符进行t编码:序号不在范围内(128)

Python UnicodeEncodeError:&x27;ascii';编解码器可以';对位置0-1中的字符进行t编码:序号不在范围内(128),python,unicode,Python,Unicode,我不知道这个错误的确切来源是什么以及如何修复它。我是通过跑步得到的 这部分代码会引发错误: with open('results.csv', 'w') as f: dw = csv.DictWriter(f, fieldnames=fields, delimiter='|') dw.writer.writerow(dw.fieldnames) dw.writerows(results) 您正在打开一个ASCII文件,然后尝试向其中写入非ASCII数据。我猜编写该脚本的人

我不知道这个错误的确切来源是什么以及如何修复它。我是通过跑步得到的


这部分代码会引发错误:

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字符,所以他从未遇到错误

但是,如果您查看文档中的,您会发现模块无法正确处理Unicode字符串(这是Beauty Soup返回的结果),CSV文件必须始终以二进制模式打开,并且只有UTF-8或ASCII才可以安全写入

因此,在写入字符串之前,需要将所有字符串编码为UTF-8。我最初认为在编写时对字符串进行编码就足够了,但是Python 2
csv
模块无论如何都会阻塞Unicode字符串。所以我想除了对每个字符串进行显式编码之外,没有其他方法了:

parse_results()
中,更改行

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


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

这应该可以。对我有用。代码片段

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)

我改变了代码,但我还是犯了同样的错误。你能查一下我更新的帖子吗?你能自己运行这个程序而不出错吗?嗯,这是相同的错误,但它发生在不同的行上。如果你刚刚切换了两个区块,行号应该保持不变-你还做了什么改变吗?我是通过谷歌搜索来这里的,这个改变为我修正了错误。有趣的是,对我来说“是”导致蟒蛇窒息。这是预期的吗?@user763410:文本
应该可以,但是该实体编码的字符超出了ASCII范围,因此它实际上可能会导致错误。
with open('results.csv', 'w') as f:
    dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
    dw.writer.writerow(dw.fieldnames)
    dw.writerows(results)
results.append({'url': url, 'create_date': create_date, 'title': title})
results.append({'url': url, 'create_date': create_date, 'title': title.encode("utf-8")})
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)