首页 文章

csv python中的Unicode编码错误

提问于
浏览
1

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

所以在经过一些研究之后,我发现了文档中的示例以及关于SO的类似问题:Read and Write CSV files including unicode with Python 2.7但我无法使用以下代码:

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的一列而不是一行 .

1 回答

  • 3

    你本质上拥有的是一组键值对,所以你基本上只有一组值,当调用 zip 时,最终会被分解为单个字符'rows':

    >>> 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()])
    

    或者,使用codecs.open与编码来解决 unicode 手动解码 unicode .

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

相关问题