Unicode在使用utf-8的DictWriter时出错

Unicode在使用utf-8的DictWriter时出错,unicode,utf-8,python-2.7,export-to-csv,Unicode,Utf 8,Python 2.7,Export To Csv,我正在尝试将包含utf-8字符串的字典写入CSV。我正在按照你的指示做。然而,尽管对这些utf-8字符串进行了细致的编码和解码,我还是得到了一个涉及“ascii”集的UnicodeEncodeErrors 我有一个字典列表,其中包含字符串和整数作为与维基百科文章更改相关的值。下面的列表对应于,例如: edgelist = [{'articleName': 'Barack Obama', 'editorName': 'Schonbrunn', 'revID': '121844749', 'byte

我正在尝试将包含utf-8字符串的字典写入CSV。我正在按照你的指示做。然而,尽管对这些utf-8字符串进行了细致的编码和解码,我还是得到了一个涉及“ascii”集的UnicodeEncodeErrors

我有一个字典列表,其中包含字符串和整数作为与维基百科文章更改相关的值。下面的列表对应于,例如:

edgelist = [{'articleName': 'Barack Obama', 'editorName': 'Schonbrunn', 'revID': '121844749', 'bytesAdded': '183'}, 
{'articleName': 'Barack Obama', 'editorName': 'Eep\xc2\xb2', 'revID': '121862749', 'bytesAdded': '107'}]
问题是
列表[1]['editorName']
。它有
'str'
el[1]['editorName']类型。decode('utf-8')
u'Eep\xb2'

我正在尝试的代码是:

_ENCODING = 'utf-8'
def dictToCSV(edgelist,output_file):
    with codecs.open(output_file,'wb',encoding=_ENCODING) as f:
        w = csv.DictWriter(f,sorted(edgelist[0].keys()))
        w.writeheader()
        for d in edgelist:
            for k,v in d.items():
                if type(v) == int:
                    d[k]=str(v).encode(_ENCODING)
            w.writerow({k:v.decode(_ENCODING) for k,v in d.items()})
这将返回:

dictToCSV(edgelist,'test2.csv')
File "csv_to_charts.py", line 129, in dictToCSV
w.writerow({k:v.decode(_ENCODING,'ignore') for k,v in d.items()})
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 148, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb2' in position 3: ordinal not in range(128)
其他排列,如将解码换为编码或在最后有问题的行中不执行任何操作,也会返回错误:

  • w.writerow({k:v.encode(_encode)表示k,v在d.items()中)
    返回
    'UnicodeDecodeError:'ascii'编解码器无法解码第56位的字节0xc2:序号不在范围(128)
  • w.writerow({k:v代表k,v在d.items()})
    返回
    UnicodeDecodeError:'ascii'编解码器无法解码第56位的字节0xc2:序号不在范围内(128)
  • 接下来,我将codecs.open(output_file,'wb',encoding=_encoding)更改为f:,将open(output_file,'wb')更改为f:,但仍然收到相同的错误

  • 排除列表元素或包含此有问题字符串的键,否则脚本工作正常。

    ASCII编码的严格解释只允许序号0-127。根据定义,超出该范围的任何值都不是ASCII。由于\xc2和\xb2的序数都大于127,因此不能将它们解释为ASCII


    我不是Python用户,它提到ASCII是一种常见用法,但为MIME类型定义了一个可选的“charset”参数;我想知道您正在使用的编写器是否也有“编码”设置?

    我刚刚按如下方式编辑了您的代码,并且csv编写成功

    from django.utils.encoding import smart_str
    import csv
    
    def dictToCSV(edgelist, output_file):
        f = open(output_file, 'wb')
        w = csv.DictWriter(f, fieldnames=sorted(edgelist[0].keys()))
        w.writeheader()
        for d in edgelist:
            w.writerow(dict(k=smart_str(v)) for k, v in d.items())
        f.close()
    

    复制Django代码并根据需要进行自定义。

    您的字符串已在UTF-8中,DictWriter无法与
    编解码器一起使用。请打开
    。以下示例:

    输出:

    articleName,bytesAdded,editorName,revID
    Barack Obama,183,Schonbrunn,121844749
    Barack Obama,107,Eep²,121862749
    
    注意,您可以直接使用
    'editorName':'Eep²'
    ,而不是
    'editorName':'Eep\xc2\xb2'
    。如果将源文件保存为UTF-8,则字节字符串将按照
    #coding:UTF-8
    进行UTF-8编码

    articleName,bytesAdded,editorName,revID
    Barack Obama,183,Schonbrunn,121844749
    Barack Obama,107,Eep²,121862749