Как преобразовать 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" 

Проблема с вашим желаемым результатом заключается в том, что он недействителен json document ;; это stream документов 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') 

Я принял ответ @ 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) 

Редактировать:

Упрощенный подход

 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) 

Добавьте параметр 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) 
 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) 

Документация json.dumps ()

Как насчет использования Pandas для чтения csv-файла в DataFrame ( pd.read_csv ), а затем манипулирования столбцами, если хотите (сбросить их или обновить значения) и, наконец, преобразовать DataFrame обратно в 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, итерация по типу имен полей:

 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) 
  • pandas 0.21.0 Проблема совместимости с меткой времени с помощью matplotlib
  • Как построить несколько функций на одной фигуре в Matplotlib?
  • VScode начинает отладку в интегрированном терминале вместо консоли отладки
  • JavaScript повышает значение SyntaxError с данными, отображаемыми в шаблоне Jinja
  • Установить значение для конкретной ячейки в pandas DataFrame с использованием индекса
  • PyQt показывает видеоstream из opencv
  • itertools.groupby () не группируется правильно
  • Добавление двух рядов с NaN
  • Как поместить переменную внутри строки в Python?
  • Как имитировать медленное подключение к Интернету
  • Как вычесть день с даты?
  • Interesting Posts

    ng-app vs. data-ng-app, в чем разница?

    Событие Fire каждый раз, когда элемент DropDownList выбран с помощью jQuery

    Воспроизведение нескольких аудиоклипов с использованием объектов Clip

    Как интегрировать шаги Samsung Gear в приложении Android?

    рисовать на экране без формы

    Открыть рабочие листы в новом окне в Excel 2010 без доступа администратора

    Как предварительно загружать вкладки / устанавливать несколько веб-сайтов по умолчанию в Firefox, IE и т. Д.

    Cassandra cqlsh – как показать микросекунды / миллисекунды для столбцов временной отметки?

    Как прокручивать в tmux?

    Перенаправить Runtime.getRuntime (). Exec () с помощью System.setOut ();

    «Неверное строковое значение» при попытке вставить UTF-8 в MySQL через JDBC?

    Класс Java, который реализует карту и сохраняет порядок вставки?

    Услуги Non-Singleton в AngularJS

    Как показать изображение в полноэкранном режиме на экране imageView?

    Язык распознавания речи Windows 8

    Давайте будем гением компьютера.