Как конвертировать JSON в CSV?(с поддержкой UTF-8) - PullRequest
0 голосов
/ 29 декабря 2018

Ранее был вопрос Как я могу преобразовать JSON в 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 голосов
/ 31 декабря 2018

Задано 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

...