Вот мой код, очень простые вещи ...
import csv
import json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)
Объявите имена некоторых полей, программа чтения использует CSV для чтения файла, а имена полей - для вывода файла в формат JSON. Вот в чем проблема ...
Каждая запись в CSV-файле находится в отдельной строке. Я хочу, чтобы вывод JSON был таким же. Проблема в том, что он сваливает все на одну огромную длинную линию.
Я пробовал использовать что-то вроде, for line in csvfile:
а затем запустить свой код ниже этого, с reader = csv.DictReader( line, fieldnames)
которым проходит цикл через каждую строку, но он выполняет весь файл в одной строке, затем просматривает весь файл в другой строке ... продолжается, пока не закончатся строки .
Есть предложения по исправлению этого?
Изменить: чтобы уточнить, в настоящее время у меня есть: (каждая запись в строке 1)
[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]
Что я ищу: (2 записи на 2 строчке)
{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}
Не каждое отдельное поле с отступом / на отдельной строке, а каждая запись на отдельной строке.
Некоторые образцы ввода.
"John","Doe","001","Message1"
"George","Washington","002","Message2"
[{..row..},{..row..},...]
не{..row..}{..row..}..
. То есть вывод выглядит так, как будто это будет массив json-объектов json, а не поток несвязанных объектов json.Ответы:
Проблема с желаемым результатом заключается в том, что это недопустимый документ json; это поток json-документов !
Ничего страшного, если это то, что вам нужно, но это означает, что для каждого документа, который вы хотите выводить, вам придется вызывать
json.dumps
.Поскольку символ новой строки, который вы хотите разделить в своих документах, не содержится в этих документах, вы рискуете поставить его самостоятельно. Итак, нам просто нужно вытащить цикл из вызова json.dump и вставить новые строки для каждого написанного документа.
источник
DictReader
создать безfieldnames
аргумента; Затем он прочитает первую строку, чтобы получить имена полей из файла.csvfile = open('file.csv', 'r',encoding='utf-8')
иjsonfile = open('file.json', 'w',encoding='utf-8')
Для этого вы можете использовать Pandas DataFrame в следующем примере:
источник
Я взял ответ @ SingleNegationElimination и упростил его до трехстрочного сообщения, которое можно использовать в конвейере:
источник
Документация json.dumps ()
источник
Вы можете попробовать это
Редактировать:
Более простой подход
источник
csvmapper
, чтобы сделать это (и, возможно, где его получить), а не что-то встроенное.Добавьте
indent
параметр вjson.dumps
Также обратите внимание, что вы можете просто использовать
json.dump
с открытымjsonfile
:источник
Я вижу, что это старый, но мне нужен код из SingleNegationElimination, однако у меня возникла проблема с данными, содержащими символы, отличные от utf-8. Они появлялись в областях, которые меня не особо интересовали, поэтому я решил проигнорировать их. Однако это потребовало определенных усилий. Я новичок в python, поэтому методом проб и ошибок я заставил его работать. Код является копией SingleNegationElimination с дополнительной обработкой utf-8. Я пытался сделать это с помощью https://docs.python.org/2.7/library/csv.html, но в конце концов сдался. Приведенный ниже код работал.
источник
Как насчет использования Pandas для чтения файла csv в DataFrame ( pd.read_csv ), затем манипулирования столбцами, если хотите (удаление их или обновление значений) и, наконец, преобразования DataFrame обратно в JSON ( pd.DataFrame.to_json ).
Примечание: я не проверял, насколько это будет эффективно, но это определенно один из самых простых способов манипулировать и преобразовывать большой csv в json.
источник
В качестве небольшого улучшения ответа @MONTYHS, итерация через несколько имен полей:
источник
источник
DictReader
, поэтому он угадывает имена полей из первой строки входного файла: John, Doe, 5, «None» вместо «FirstName, lastname» и так далее ...TypeError: expected string or buffer