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

时间:2018-12-29 19:20:13

标签: python python-2.7 utf-8

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

假设我有一个如下所示的JSON文件:

[
    {"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 个答案:

答案 0 :(得分:3)

给出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时指定的编码进行解码。

如果将在Excel中打开.CSV,则使用

utf-8-sig,否则使用utf8

输出:

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

在Excel中:

Excel display