Wie konvertiert man eine CSV-Datei in mehrzeiliges JSON?

Hier's mein Code, wirklich einfaches Zeug...

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)

Deklarieren Sie einige Feldnamen, der Leser verwendet CSV, um die Datei zu lesen, und die Dateinamen, um die Datei in ein JSON-Format zu dumpen. Hier's das Problem...

Jeder Datensatz in der CSV-Datei befindet sich in einer anderen Zeile. Ich möchte, dass die JSON-Ausgabe auf die gleiche Weise erfolgt. Das Problem ist, dass es alles auf eine riesige, lange Zeile ausgibt.

Ich habe versucht, mit so etwas wie for line in csvfile: und dann läuft mein Code unter, dass mit reader = csv.DictReader( line, fieldnames), die Schleifen durch jede Zeile, aber es tut die gesamte Datei auf einer Zeile, dann Schleifen durch die gesamte Datei auf einer anderen Zeile ... weiter, bis es läuft aus Zeilen.

Gibt es Vorschläge zur Korrektur dieses Problems?

Edit: Zur Klarstellung, derzeit habe ich: (jeder Datensatz in Zeile 1)

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

Wonach ich suche: (2 Datensätze in 2 Zeilen)

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

Nicht jedes einzelne Feld eingerückt/auf einer eigenen Zeile, sondern jeder Datensatz auf seiner eigenen Zeile.

Einige Beispieleingaben.

"John","Doe","001","Message1"
"George","Washington","002","Message2"
Lösung

Das Problem mit Ihrer gewünschten Ausgabe ist, dass es sich nicht um ein gültiges json-Dokument handelt, sondern um einen Stream von json-Dokumenten!

Das ist in Ordnung, wenn es das ist, was Sie brauchen, aber das bedeutet, dass Sie für jedes Dokument, das Sie in Ihrer Ausgabe haben wollen, json.dumps aufrufen müssen.

Da der Zeilenumbruch, den Sie zur Trennung Ihrer Dokumente benötigen, nicht in diesen Dokumenten enthalten ist, müssen Sie ihn selbst liefern. Wir müssen also nur die Schleife aus dem Aufruf von json.dump herausziehen und Zeilenumbrüche für jedes geschriebene Dokument einfügen.

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

Hinzufügen des Parameters indent zu json.dumps

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

Beachten Sie auch, dass Sie einfach json.dump mit der offenen jsonfile verwenden können:

json.dump(data, jsonfile)
Kommentare (1)
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)
Kommentare (4)