Здесь's мой код, очень простые вещи...
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, чтобы быть таким же образом. Проблема сваливает все на один гигантский, длинной линии.
Я'вэ пытался использовать что-то вроде для строки в csvfile, был:
а то мой ниже, что код с читатель = CSV-файл.DictReader( строки, поля)
, который перебирает каждую строку, но это не весь файл в одну строку, затем перебирает весь файл на другой линии... продолжается, пока не закончатся строки.
Любые предложения по исправлению этого?
Редактировать:, чтобы уточнить, на данный момент у меня есть: (каждая запись в строке 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"
Проблема с ваш желаемый результат заключается в том, что он не является допустимым JSON-документ,; его'ы поток JSON-документы!
Что'ы хорошо, если его, что вам нужно, но это означает, что для каждого документа, который вы хотите в ваш выходной, вы'придется позвонить в JSON.отвалите`.
С новой строки необходимо отделять свои документы, не содержащиеся в этих документах, вы'вновь на крючке для подачи себя. Так что нам просто нужно вытянуть петлю из вызова в формате 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)
for row in reader:
json.dump(row, jsonfile)
jsonfile.write('\n')
Вы можете использовать панд 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)
Я взял @SingleNegationElimination'ответ Ы и упрощенный его в трех-вкладыш, который может быть использован в трубопроводе:
import csv
import json
import sys
for row in csv.DictReader(sys.stdin):
json.dump(row, sys.stdout)
sys.stdout.write('\n')
import csv
import json
file = 'csv_file_name.csv'
json_file = 'output_file_name.json'
#Read CSV File
def read_CSV(file, json_file):
csv_rows = []
with open(file) as csvfile:
reader = csv.DictReader(csvfile)
field = reader.fieldnames
for row in reader:
csv_rows.extend([{field[i]:row[field[i]] for i in range(len(field))}])
convert_write_json(csv_rows, json_file)
#Convert csv data into json
def convert_write_json(data, json_file):
with open(json_file, "w") as f:
f.write(json.dumps(data, sort_keys=False, indent=4, separators=(',', ': '))) #for pretty
f.write(json.dumps(data))
read_CSV(file,json_file)
Вы можете попробовать это
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)
Редактировать:
Простой подход
import csvmapper
fields = ('FirstName', 'LastName', 'IDNumber', 'Messages')
parser = CSVParser('sample.csv', csvmapper.FieldMapper(fields))
converter = csvmapper.JSONConverter(parser)
print converter.doConvert(pretty=True)
Добавить параметр отступ
на `в JSON.отвалов
data = {'this': ['has', 'some', 'things'],
'in': {'it': 'with', 'some': 'more'}}
print(json.dumps(data, indent=4))
Также обратите внимание, что вы можете просто использовать в JSON.свалка
с jsonfile
:
json.dump(data, jsonfile)
Как насчет использования панд, чтобы прочитать файл CSV в таблицу данных (ПД.read_csv), затем манипулируя столбцов, если вы хотите (опуская их или обновление значений) и, наконец, преобразование таблицы данных обратно в JSON (ПД.Таблицы данных.to_json).
Примечание: Я не'т проверили, насколько эффективно это будет, но это, безусловно, один из самых простых способов манипуляции и преобразования большого файла CSV в JSON.
Я вижу, что это старый, но мне нужен код от 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
Как незначительное улучшение к @MONTYHS ответа, перебора наконечником из поля:
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)
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)