Bagaimana mengkonversi file CSV untuk multiline JSON?

Berikut ini's kode saya, benar-benar hal-hal sederhana...

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)

Menyatakan beberapa nama field, pembaca menggunakan CSV untuk membaca file, dan mengajukan nama-nama untuk dump file ke format JSON. Berikut ini's masalah...

Setiap record dalam file CSV adalah pada baris yang berbeda. Aku ingin JSON output yang akan dengan cara yang sama. Masalah itu kesedihan itu semua di satu raksasa, panjang garis.

I've mencoba menggunakan sesuatu seperti untuk baris di csvfile: dan kemudian menjalankan kode di bawah ini yang dengan reader = csv.DictReader( line, fieldnames) yang loop melalui masing-masing jalur, tetapi tidak seluruh file pada satu baris, maka loop melalui seluruh file pada baris lain... terus sampai berjalan keluar dari garis.

Saran untuk memperbaiki ini?

Edit: Untuk memperjelas, saat ini saya memiliki: (setiap record pada baris 1)

[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]

Apa yang saya'm-tempat ideal untuk: (2 catatan pada 2 baris)

{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}

Tidak setiap individu bidang menjorok/pada baris terpisah, tetapi masing-masing record pada itu's line sendiri.

Beberapa contoh input.

"John","Doe","001","Message1"
"George","Washington","002","Message2"
Mengomentari pertanyaan (1)
Larutan

Masalah dengan output yang diinginkan anda adalah bahwa hal itu tidak berlaku dokumen json,; it's a aliran dokumen json!

Yang's baik-baik saja, jika dengan apa yang anda butuhkan, tapi itu berarti bahwa untuk setiap dokumen yang anda inginkan di output anda, anda'll harus memanggil json.kesedihan.

Sejak newline anda ingin memisahkan dokumen anda tidak terdapat dalam dokumen-dokumen tersebut, anda're di hook untuk memasok sendiri. Jadi kita hanya perlu menarik loop dari panggilan untuk json.dump dan menempatkan baris baru untuk setiap dokumen tertulis.

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')
Komentar (6)

Anda dapat menggunakan Panda DataFrame untuk mencapai hal ini, dengan Contoh berikut:

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)
Komentar (0)

Aku mengambil @SingleNegationElimination's respon dan disederhanakan menjadi tiga liner yang dapat digunakan dalam pipa:

import csv
import json
import sys

for row in csv.DictReader(sys.stdin):
    json.dump(row, sys.stdout)
    sys.stdout.write('\n')
Komentar (0)
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)

Dokumentasi dari json.kesedihan()

Komentar (0)

Anda dapat mencoba ini

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:

Pendekatan yang lebih sederhana

import csvmapper

fields = ('FirstName', 'LastName', 'IDNumber', 'Messages')
parser = CSVParser('sample.csv', csvmapper.FieldMapper(fields))

converter = csvmapper.JSONConverter(parser)

print converter.doConvert(pretty=True)
Komentar (1)

Tambahkan indent parameter json.kesedihan

 data = {'this': ['has', 'some', 'things'],
         'in': {'it': 'with', 'some': 'more'}}
 print(json.dumps(data, indent=4))

Juga perhatikan bahwa, anda hanya dapat menggunakan json.dump dengan membuka jsonfile:

json.dump(data, jsonfile)
Komentar (1)

Bagaimana menggunakan Panda untuk membaca file csv ke DataFrame (pd.read_csv), kemudian memanipulasi kolom jika anda ingin (menjatuhkan mereka atau memperbarui nilai-nilai) dan akhirnya mengubah DataFrame kembali ke JSON (pd.DataFrame.to_json).

Catatan: aku belum't diperiksa seberapa efisien ini akan tetapi ini adalah pasti salah satu cara termudah untuk memanipulasi dan mengubah besar csv untuk json.

Komentar (0)

Saya lihat ini sudah tua tapi aku butuh kode dari SingleNegationElimination namun saya punya masalah dengan data yang mengandung non utf-8 karakter. Ini muncul di bidang saya tidak terlalu peduli dengan jadi saya memilih untuk mengabaikan mereka. Namun yang mengambil beberapa upaya. Saya baru python jadi dengan beberapa trial dan error saya mendapatkannya untuk bekerja. Kode adalah salinan dari SingleNegationElimination dengan tambahan penanganan utf-8. Saya mencoba untuk melakukannya dengan https://docs.python.org/2.7/library/csv.html tapi pada akhirnya menyerah. Kode di bawah ini bekerja.

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
Komentar (0)

Sebagai sedikit perbaikan untuk @MONTYHS menjawab, iterasi melalui tup dari fieldnames:

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)
Komentar (0)
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)
Komentar (4)