代码之家  ›  专栏  ›  技术社区  ›  Anthony

如何将JSON转换为CSV?(支持UTF-8)

  •  2
  • Anthony  · 技术社区  · 7 年前

    早些时候有一个问题 How can I convert JSON to CSV? 有很多答案,但是没有一个解释如何转换非拉丁数据。

    [
        {"id":123,"FullName":"Иванов Иван Иванович"},
        {"id":124,"FullName":"Петров Петр Петрович"}
    ]
    

    我尝试使用这样的脚本:

    #!/usr/bin/env python2.7
    # -*- coding: utf-8 -*-
    
    import sys
    import codecs
    import json
    import unicodecsv as csv
    
    if __name__ == '__main__':
        fin = codecs.open(sys.argv[1], encoding='utf-8')
        data = json.load(fin)
        fin.close()
    
        with codecs.open('test.csv', encoding='utf-8', mode='wb') as csv_file:
            w = csv.writer(csv_file, encoding='utf-8')
            w.writerow(data[0].keys())  # header row
        
            for row in data:
                w.writerow(row.values())
    

    这给了我以下错误:

    UnicodeDecodeError:“ascii”编解码器无法解码位置中的字节0xd0 32:序号不在范围内(128)

    首先,不清楚位置32是什么,但最有趣的问题是是否有办法将UTF-8编码的字符串保存到CSV文件中。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Mark Tolonen    7 年前

    鉴于 test.json (如注释中所示,带有引号和逗号):

    [
        {"id":123,"FullName":"Иванов, \"Иван\" Иванович"},
        {"id":124,"FullName":"Петров Петр Петрович"}
    ]
    

    这项工作:

    #!/usr/bin/env python2.7
    
    import json
    import unicodecsv as csv
    
    with open('test.json','rb') as fin:
        data = json.load(fin)
    
    with open('test.csv','wb') as csv_file:
        w = csv.writer(csv_file, encoding='utf-8-sig')
        w.writerow(data[0].keys())  # header row
        for row in data:
            w.writerow(row.values())
    

    这个 json 模块采用UTF-8编码。

    unicodecsv 获取以二进制模式打开的文件,并在 writer 是实例化的。

    utf-8-sig 如果.CSV将在Excel中打开,则使用,但 utf8 不然就行了。

    输出:

    FullName,id
    "Иванов, ""Иван"" Иванович",123
    Петров Петр Петрович,124
    

    在Excel中:

    Excel display