Python CSV для JSON - программирование
Подтвердить что ты не робот

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"
4b9b3361

Ответ 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)