csv python中的Unicode编码错误

csv python中的Unicode编码错误,python,csv,unicode,Python,Csv,Unicode,在python 2.7中将解析内容写入csv时,我不断遇到此类错误:UnicodeEncodeError:“ascii”编解码器无法对570-579位置的字符进行编码:序号不在范围内(128) 因此,经过一些研究,我在文档中找到了一些示例,以及一个类似的问题:但我无法使用以下代码: data = { 'scrapeUrl': url, 'model': final_model_num, 'title': final_name,

在python 2.7中将解析内容写入csv时,我不断遇到此类错误:UnicodeEncodeError:“ascii”编解码器无法对570-579位置的字符进行编码:序号不在范围内(128)

因此,经过一些研究,我在文档中找到了一些示例,以及一个类似的问题:但我无法使用以下代码:

    data = {
        'scrapeUrl': url,
        'model': final_model_num,
        'title': final_name, 
        'description': final_description, 
        'price': str(final_price), 
        'image': final_first_image, 
        'additional_image': final_images,
        'quantity': '1', 
        'subtract': '1', 
        'minimum': '1', 
        'status': '1', 
        'shipping': '1' 
    } 
    with open("local/file1.csv", "w") as f:
        writer=csv.writer(f, delimiter=",")
        writer.writerows([data.keys()])
        for row in zip(*data.values()):
            row=[s.encode('utf-8') for s in row]
            writer.writerows([row])

我的版本似乎只将每个变量的第一个字符写入每一行;我尝试删除解压键作为一点故障排除,但这导致所有数据都正确打印到csv的一列,而不是一行。

您基本上拥有的是一组键值对,因此您基本上只有一组值,当调用
zip
时,它最终被分解为单个字符的“行”:

>>> zip(*['abc', 'def', 'ghi'])
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
此外,示例中的最短值的
len
值为1,这将解释为什么得到一行,其中只有所有值的第一个字符作为输出

你想做的是

    with open("local/file1.csv", "w") as f:
        writer = csv.writer(f, delimiter=",")
        writer.writerow(data.keys())
        writer.writerow([s.encode('utf8') for s in data.values()])
或者,与编码一起使用,以避免手动将
unicode
解码为
str

    with codecs.open("local/file1.csv", "w", encoding='utf8') as f:
        writer = csv.writer(f, delimiter=",")
        writer.writerow(data.keys())
        writer.writerow(data.values())

感谢您的快速响应;理想情况下,我希望完全忽略错误并保留ascii编码。我尝试了上一个选项,但出现了相同的错误:使用codecs.open(“local/file1.csv”,“w”,encoding='ascii',errors='ignore')作为f:writer=csv.writer(f,delimiter=“,”)writerows([data.keys()])writerows([data.values()]))您提供的编辑的原始版本仍然会导致问题。现在的区别是,所有文本都是可见的,但每个字母只显示一行:打开(“local/file1.csv”,“w”)为f:writer=csv.writer(f,delimiter=“,”)writerows([data.keys()])writerows([s.encode('ascii',ignore'),用于数据中的s.values())哎呀,应该用
writerow
来表示单数行。修正了答案。最后一个快速问题;这是可行的,但它似乎在为程序的每次迭代重写CSV的第一行。我使用线程化模块在一组URL上运行相同的scrape方法,如下所示:threaded(URL,scrape_csv,num_threads=5);如何让csv编写器为每个url添加新行?