Hier ist 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 zum Lesen der Datei und die Dateinamen zum Speichern der Datei in ein JSON-Format. Hier ist das Problem ...
Jeder Datensatz in der CSV-Datei befindet sich in einer anderen Zeile. Ich möchte, dass die JSON-Ausgabe genauso ist. Das Problem ist, dass alles auf eine riesige, lange Schlange gestellt wird.
Ich habe versucht, so etwas wie zu verwenden for line in csvfile:
und dann meinen Code unter dem Code auszuführen, mit reader = csv.DictReader( line, fieldnames)
dem jede Zeile durchlaufen wird, aber es wird die gesamte Datei in einer Zeile ausgeführt und dann die gesamte Datei in einer anderen Zeile durchlaufen ... wird fortgesetzt, bis keine Zeilen mehr vorhanden sind .
Irgendwelche Vorschläge zur Korrektur?
Bearbeiten: Zur Verdeutlichung habe ich derzeit: (jeden Datensatz in Zeile 1)
[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]
Was 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 wird in einer separaten Zeile eingerückt, sondern jeder Datensatz in einer eigenen Zeile.
Einige Beispieleingaben.
"John","Doe","001","Message1"
"George","Washington","002","Message2"
[{..row..},{..row..},...]
nicht produzieren{..row..}{..row..}..
. Das heißt, die Ausgabe sieht so aus, als wäre es ein JSON-Array von JSON-Objekten, kein Stream von nicht verbundenen JSON-Objekten.Antworten:
Das Problem mit Ihrer gewünschten Ausgabe ist, dass es sich nicht um ein gültiges JSON-Dokument handelt. Es ist ein Strom 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 möchten, anrufen müssen
json.dumps
.Da die neue Zeile, in der Sie Ihre Dokumente trennen möchten, nicht in diesen Dokumenten enthalten ist, müssen Sie sie selbst bereitstellen. Wir müssen also nur die Schleife aus dem Aufruf von json.dump ziehen und für jedes geschriebene Dokument Zeilenumbrüche einfügen.
quelle
DictReader
ohnefieldnames
Argument konstruieren . Anschließend wird die erste Zeile gelesen, um die Feldnamen aus der Datei abzurufen.csvfile = open('file.csv', 'r',encoding='utf-8')
undjsonfile = open('file.json', 'w',encoding='utf-8')
Sie können Pandas DataFrame verwenden, um dies mit dem folgenden Beispiel zu erreichen:
quelle
Ich nahm die Antwort von @ SingleNegationElimination und vereinfachte sie zu einem Dreiliner, der in einer Pipeline verwendet werden kann:
quelle
Dokumentation von json.dumps ()
quelle
Sie können versuchen , diese
Bearbeiten:
Einfacherer Ansatz
quelle
csvmapper
, um dies zu tun (und möglicherweise, wo Sie es bekommen können), im Gegensatz zu etwas Eingebautem.Fügen Sie den
indent
Parameter zu hinzujson.dumps
Beachten Sie auch, dass Sie einfach
json.dump
mit dem offenen verwenden könnenjsonfile
:quelle
Ich sehe, dass dies alt ist, aber ich brauchte den Code von SingleNegationElimination, aber ich hatte ein Problem mit den Daten, die keine utf-8-Zeichen enthielten. Diese tauchten in Feldern auf, mit denen ich mich nicht allzu sehr beschäftigte, und ich beschloss, sie zu ignorieren. Dies erforderte jedoch einige Anstrengungen. Ich bin neu in Python, also habe ich es mit einigem Ausprobieren zum Laufen gebracht. Der Code ist eine Kopie von SingleNegationElimination mit der zusätzlichen Behandlung von utf-8. Ich habe versucht, es mit https://docs.python.org/2.7/library/csv.html zu tun, aber am Ende gab ich auf. Der folgende Code hat funktioniert.
quelle
Wie wäre es, wenn Sie Pandas verwenden, um die CSV-Datei in einen DataFrame ( pd.read_csv ) einzulesen , dann die Spalten zu bearbeiten , wenn Sie möchten (sie löschen oder Werte aktualisieren) und den DataFrame schließlich wieder in JSON ( pd.DataFrame.to_json ) zu konvertieren .
Hinweis: Ich habe nicht überprüft, wie effizient dies sein wird, aber dies ist definitiv eine der einfachsten Möglichkeiten, eine große CSV zu manipulieren und in JSON zu konvertieren.
quelle
Als leichte Verbesserung der Antwort von @MONTYHS, die durch eine Reihe von Feldnamen iteriert:
quelle
quelle
DictReader
übergibt, sodass die Feldnamen aus der ersten Zeile der Eingabedatei erraten werden: John, Doe, 5, "None" anstelle von "FirstName, lastname" und so weiter ...TypeError: expected string or buffer