Как конвертировать CSV файл в многострочный JSON? [дубликат]
этот вопрос уже есть ответ здесь:
- Сброс нескольких переменных на диск в Json. Одна переменная в строке 1 ответ
вот мой код, очень простой материал...
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)
который проходит через каждую строку, но он делает весь файл на одной строке, а затем проходит через весь файл на другой строке... продолжается, пока не закончатся линии.
любые предложения по исправлению это?
Edit: чтобы уточнить, в настоящее время у меня есть: (каждая запись в строке 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"
10 ответов:
проблема с желаемым выходом заключается в том, что он не является допустимым документом json,; это поток документов json!
это нормально, если это то, что вам нужно, но это означает, что для каждого документа, который вы хотите в своем выводе, вам придется позвонить
json.dumps
.Так как новая строка, которую вы хотите отделить ваши документы, не содержится в этих документах, вы находитесь на крючке для предоставления его самостоятельно. Так что нам просто нужно вытянуть петлю из вызова в формате 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')
Я взял ответ @SingleNegationElimination и упростил его в три лайнера, которые могут быть использованы в конвейере:
import csv import json import sys for row in csv.DictReader(sys.stdin): json.dump(row, sys.stdout) sys.stdout.write('\n')
Вы можете попробовать этой
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)
вы можете использовать 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)
добавить до
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)
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)
Как насчет использования Pandas для чтения csv-файла в фрейм данных (pd.read_csv), затем манипулируя столбцами, если вы хотите (отбрасывая их или обновляя значения) и, наконец, Преобразуя фрейм данных обратно в JSON (pd. DataFrame. 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, повторяя через 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)
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)