У меня есть файл JSON, который я хочу преобразовать в файл CSV. Как я могу сделать это с Python?
Я попытался:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
csv_file.writerow(item)
f.close()
Однако это не сработало. Я использую Django, и я получил ошибку:
file' object has no attribute 'writerow'
Затем я попробовал следующее:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
f.writerow(item) # ← changed
f.close()
Я тогда получаю ошибку:
sequence expected
Пример файла JSON:
[{
"pk": 22,
"model": "auth.permission",
"fields": {
"codename": "add_logentry",
"name": "Can add log entry",
"content_type": 8
}
}, {
"pk": 23,
"model": "auth.permission",
"fields": {
"codename": "change_logentry",
"name": "Can change log entry",
"content_type": 8
}
}, {
"pk": 24,
"model": "auth.permission",
"fields": {
"codename": "delete_logentry",
"name": "Can delete log entry",
"content_type": 8
}
}, {
"pk": 4,
"model": "auth.permission",
"fields": {
"codename": "add_group",
"name": "Can add group",
"content_type": 2
}
}, {
"pk": 10,
"model": "auth.permission",
"fields": {
"codename": "add_message",
"name": "Can add message",
"content_type": 4
}
}
]
jq
, как описано здесь: stackoverflow.com/questions/32960857/…Ответы:
Во-первых, ваш JSON имеет вложенные объекты, поэтому его обычно нельзя напрямую преобразовать в CSV. Вам нужно изменить это на что-то вроде этого:
Вот мой код для генерации CSV из этого:
Вы получите вывод как:
источник
[u'
и']
. Какой обходной путь (без постобработки)? если есть один ... :)TypeError: a bytes-like object is required, not 'str'
наf.writerow(['pk', 'model', 'codename', 'name', 'content_type'])
f = csv.writer(open("test.csv", "w", newline=''))
С
pandas
библиотекой , это так же просто , как с помощью двух команд!Преобразовать строку JSON в объект pandas (либо серию, либо фрейм данных). Затем, предполагая, что результаты были сохранены как
df
:Который может либо вернуть строку, либо записать напрямую в csv-файл.
Основываясь на многословности предыдущих ответов, мы все должны поблагодарить панд за ярлык.
источник
.to_csv()
действительно мощный (например, бесплатная фильтрация столбцов). Мне нужно выучить панд.orient='records'
должен быть установлен, но каждая строкаfields
все равно будет adict
, что не является запрошенным OP.Я предполагаю, что ваш JSON-файл будет декодирован в список словарей. Сначала нам нужна функция, которая будет выравнивать объекты JSON:
Результат выполнения этого фрагмента на вашем объекте JSON:
является
После применения этой функции к каждому dict во входном массиве объектов JSON:
и найти соответствующие имена столбцов:
нетрудно запустить это через модуль csv:
Надеюсь, это поможет!
источник
JSON может представлять самые разнообразные структуры данных - «объект» JS примерно похож на Python dict (со строковыми ключами), «массив» JS примерно похож на список Python, и вы можете вложить их до финала » Листовые элементы представляют собой числа или строки.
По сути, CSV может представлять только двумерную таблицу - необязательно с первой строкой «заголовков», то есть «имен столбцов», что может сделать таблицу интерпретируемой как список диктов, вместо обычной интерпретации, как список списки (опять же, «листовые» элементы могут быть числами или строками).
Таким образом, в общем случае вы не можете перевести произвольную структуру JSON в CSV. В некоторых особых случаях вы можете это сделать (массив массивов без дальнейшей вложенности; массивы объектов, которые имеют одинаковые ключи). Какой особый случай, если таковой имеется, относится к вашей проблеме? Детали решения зависят от того, какой конкретный случай у вас есть. Учитывая тот удивительный факт, что вы даже не упомянули, какое из них применимо, я подозреваю, что вы, возможно, не учли ограничение, на самом деле не применим ни один из применимых случаев, и вашу проблему невозможно решить. Но, пожалуйста, уточните!
источник
Универсальное решение, которое переводит любой список плоских объектов json в csv.
Передайте файл input.json в качестве первого аргумента в командной строке.
источник
Этот код должен работать для вас, предполагая, что ваши данные JSON находятся в файле с именем
data.json
.источник
csv_file.writerow
(нет,f.writerow
конечно, я предполагаю, что вы сделали опечатку там!) Хочет последовательность, а не диктат - и в вашем примере каждый элемент является диктатом. Это будет работать для ДРУГОГО особого случая, как я определил в своем ответе - где файл JSON имеет массив массивов; он не работает для массива объектов, что является особым случаем, который вы пытаетесь решить (для этого требуетсяcsv.DictWriter
- и, конечно, вам нужно извлечь имена полей и выбрать порядок, чтобы создать его экземпляр ! -).Это будет легко использовать
csv.DictWriter()
, подробная реализация может быть такой:Обратите внимание, что это предполагает, что все ваши объекты JSON имеют одинаковые поля.
Вот ссылка, которая может вам помочь.
источник
У меня были проблемы с предложенным Дэном решением , но это сработало для меня:
Где «test.json» содержал следующее:
источник
Используйте
json_normalize
отpandas
:test.json
encoding='utf-8'
может не быть необходимым.pathlib
библиотеку.open
это методpathlib
Выход CSV:
Другие ресурсы для более сильно вложенных объектов JSON:
источник
Как упоминалось в предыдущих ответах, сложность преобразования json в csv заключается в том, что файл json может содержать вложенные словари и, следовательно, быть многомерной структурой данных, а csv - это 2D структура данных. Однако хороший способ превратить многомерную структуру в csv - это иметь несколько csv, которые связаны с первичными ключами.
В вашем примере первый вывод csv содержит столбцы «pk», «model», «fields» в качестве столбцов. Значения для «pk» и «model» легко получить, но поскольку столбец «fields» содержит словарь, он должен быть собственным csv, а поскольку «codename» является первичным ключом, его можно использовать в качестве входных данных. для "полей", чтобы завершить первый CSV. Второй CSV содержит словарь из столбца «fields» с кодовым именем в качестве первичного ключа, который можно использовать для связывания двух CSV.
Вот решение для вашего файла JSON, который преобразует вложенные словари в 2 CSV.
источник
Я знаю, что прошло много времени с тех пор, как был задан этот вопрос, но я подумал, что мог бы добавить к ответу всех остальных и поделиться сообщением в блоге, которое, я думаю, объяснит решение в очень сжатой форме.
Вот ссылка
Откройте файл для записи
Создайте объект csv writer
Обязательно закройте файл, чтобы сохранить содержимое
источник
Это не очень умный способ сделать это, но у меня была та же проблема, и это сработало для меня:
источник
Ответ Алека великолепен, но он не работает в случае, когда есть несколько уровней вложенности. Вот модифицированная версия, которая поддерживает несколько уровней вложенности. Это также делает имена заголовков более привлекательными, если вложенный объект уже указывает свой собственный ключ (например, данные Firebase Analytics / BigTable / BigQuery):
источник
Это работает относительно хорошо. Это выравнивает JSON, чтобы записать его в CSV-файл. Вложенные элементы управляются :)
Это для питона 3
наслаждаться.
источник
json.loads
не работал, я заставил его работатьjson.load
, что приятно выдает объект списка. В-третьих, вложенные элементы были потеряны.Мой простой способ решить это:
Создайте новый файл Python, например: json_to_csv.py
Добавьте этот код:
После добавления этого кода сохраните файл и запустите на терминале:
Я надеюсь, что это поможет вам.
ДО ВСТРЕЧИ!
источник
Удивительно, но я обнаружил, что ни один из ответов, опубликованных здесь, до сих пор правильно не рассматривал все возможные сценарии (например, вложенные символы, вложенные списки, значения None и т. Д.).
Это решение должно работать во всех сценариях:
источник
Попробуй это
источник
Этот код работает для любого файла JSON
источник
Изменен ответ Алек МакГейл для поддержки JSON со списками внутри
Спасибо!
источник
источник
Если мы рассмотрим приведенный ниже пример преобразования файла формата json в файл в формате csv.
Приведенный ниже код преобразует файл json (data3.json) в файл csv (data3.csv).
Вышеупомянутый код был выполнен в локально установленном pycharm, и он успешно преобразовал файл json в файл csv. Надеюсь, что это поможет конвертировать файлы.
источник
Поскольку данные представляются в формате словаря, может показаться, что на самом деле следует использовать csv.DictWriter () для фактического вывода строк с соответствующей информацией заголовка. Это должно позволить преобразованию быть обработанным несколько легче. Параметр fieldnames затем установил бы порядок должным образом, в то время как вывод первой строки в качестве заголовков позволил бы его прочитать и обработать позже csv.DictReader ().
Например, Майк Репасс использовал
Однако просто измените начальную настройку на output = csv.DictWriter (набор файлов, fieldnames = data [0] .keys ())
Обратите внимание, что поскольку порядок элементов в словаре не определен, возможно, вам придется явно создавать записи с именами полей. Как только вы это сделаете, писатель будет работать. Затем записи работают так, как показано на рисунке.
источник
К сожалению, у меня нет репутации, чтобы внести небольшой вклад в удивительный ответ @Alec McGail. Я использовал Python3, и мне нужно было преобразовать карту в список после комментария @Alexis R.
Кроме того, я обнаружил, что писатель CSV добавляет дополнительный CR в файл (у меня есть пустая строка для каждой строки с данными внутри файла CSV). Решение было очень простым после ответа @Jason R. Coombs на эту тему: CSV в Python добавляет дополнительный возврат каретки
Вам просто нужно добавить параметр lineterminator = '\ n' в csv.writer. Это будет:
csv_w = csv.writer( out_file, lineterminator='\n' )
источник
Вы можете использовать этот код для преобразования json-файла в csv-файл. После прочтения файла я конвертирую объект в pandas dataframe, а затем сохраняю его в CSV-файл.
источник
Возможно, я опоздал на вечеринку, но, думаю, я справился с подобной проблемой. У меня был файл JSON, который выглядел так
Я только хотел извлечь несколько ключей / значений из этого файла JSON. Итак, я написал следующий код, чтобы извлечь то же самое.
Я надеюсь, это поможет. Подробнее о том, как работает этот код, вы можете проверить здесь
источник
Это модификация ответа @ MikeRepass. Эта версия записывает CSV в файл и работает как для Python 2, так и для Python 3.
источник