Python CSV для JSON
Вот мой код, очень простой материал...
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"
Ответы
Ответ 1
Проблема с вашим желаемым результатом заключается в том, что он недействителен json document;; это поток документов json!
Это хорошо, если это вам нужно, но это означает, что для каждого документа, который вы хотите в своем выходе, вам нужно позвонить json.dumps
.
Поскольку новая строка, которую вы хотите разделить ваши документы, не содержится в этих документах, вы находитесь на крючке для ее поставки самостоятельно. Поэтому нам просто нужно вытащить цикл из вызова json.dump и вставить новые строки для каждого написанного документа.
import csv
import json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
for row in reader:
json.dump(row, jsonfile)
jsonfile.write('\n')
Ответ 2
Вы можете попробовать this
import csvmapper
# how does the object look
mapper = csvmapper.DictMapper([
[
{ 'name' : 'FirstName'},
{ 'name' : 'LastName' },
{ 'name' : 'IDNumber', 'type':'int' },
{ 'name' : 'Messages' }
]
])
# parser instance
parser = csvmapper.CSVParser('sample.csv', mapper)
# conversion service
converter = csvmapper.JSONConverter(parser)
print converter.doConvert(pretty=True)
Edit:
Упрощенный подход
import csvmapper
fields = ('FirstName', 'LastName', 'IDNumber', 'Messages')
parser = CSVParser('sample.csv', csvmapper.FieldMapper(fields))
converter = csvmapper.JSONConverter(parser)
print converter.doConvert(pretty=True)
Ответ 3
Я принял ответ @SingleNegationElimination и упростил его в трехстрочный, который можно использовать в конвейере:
import csv
import json
import sys
for row in csv.DictReader(sys.stdin):
json.dump(row, sys.stdout)
sys.stdout.write('\n')
Ответ 4
Добавьте параметр indent
в json.dumps
data = {'this': ['has', 'some', 'things'],
'in': {'it': 'with', 'some': 'more'}}
print(json.dumps(data, indent=4))
Также обратите внимание, что вы можете просто использовать json.dump
с открытым jsonfile
:
json.dump(data, jsonfile)
Ответ 5
Как насчет использования Pandas для чтения файла csv в DataFrame (pd.read_csv), а затем манипулировать столбцами, если вы хотите ( удаление их или обновление значений) и, наконец, преобразование DataFrame обратно в JSON (pd.DataFrame.to_json).
Примечание. Я не проверял, насколько это будет эффективно, но это, безусловно, один из самых простых способов манипулирования и преобразования больших csv в json.
Ответ 6
Я вижу, что это старый, но мне нужен код из SingleNegationElimination, но у меня была проблема с данными, содержащими символы не utf-8. Они появились в полях, которые меня не слишком волнуют, поэтому я решил игнорировать их. Однако это приложило определенные усилия. Я новичок в python, поэтому с некоторыми проб и ошибок я получил его для работы. Код является копией SingleNegationElimination с дополнительной обработкой utf-8. Я попытался сделать это с помощью https://docs.python.org/2.7/library/csv.html, но в конце концов сдался. Приведенный ниже код работал.
import csv, json
csvfile = open('file.csv', 'r')
jsonfile = open('file.json', 'w')
fieldnames = ("Scope","Comment","OOS Code","In RMF","Code","Status","Name","Sub Code","CAT","LOB","Description","Owner","Manager","Platform Owner")
reader = csv.DictReader(csvfile , fieldnames)
code = ''
for row in reader:
try:
print('+' + row['Code'])
for key in row:
row[key] = row[key].decode('utf-8', 'ignore').encode('utf-8')
json.dump(row, jsonfile)
jsonfile.write('\n')
except:
print('-' + row['Code'])
raise
Ответ 7
В качестве незначительного улучшения для ответа @MONTYHS, итерации через tup имен полей:
import csv
import json
csvfilename = 'filename.csv'
jsonfilename = csvfilename.split('.')[0] + '.json'
csvfile = open(csvfilename, 'r')
jsonfile = open(jsonfilename, 'w')
reader = csv.DictReader(csvfile)
fieldnames = ('FirstName', 'LastName', 'IDNumber', 'Message')
output = []
for each in reader:
row = {}
for field in fieldnames:
row[field] = each[field]
output.append(row)
json.dump(output, jsonfile, indent=2, sort_keys=True)
Ответ 8
Вы можете использовать Pandas DataFrame для этого, со следующим примером:
import pandas as pd
csv_file = pd.DataFrame(pd.read_csv("path/to/file.csv", sep = ",", header = 0, index_col = False))
csv_file.to_json("/path/to/new/file.json", orient = "records", date_format = "epoch", double_precision = 10, force_ascii = True, date_unit = "ms", default_handler = None)
Ответ 9
import csv
import json
csvfile = csv.DictReader('filename.csv', 'r'))
output =[]
for each in csvfile:
row ={}
row['FirstName'] = each['FirstName']
row['LastName'] = each['LastName']
row['IDNumber'] = each ['IDNumber']
row['Message'] = each['Message']
output.append(row)
json.dump(output,open('filename.json','w'),indent=4,sort_keys=False)