Ich habe eine JSON-Datei, die ich in eine CSV-Datei konvertieren möchte. Wie kann ich das mit Python machen?
Ich habe es versucht:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
csv_file.writerow(item)
f.close()
Es hat jedoch nicht funktioniert. Ich benutze Django und der Fehler, den ich erhalten habe, ist:
file' object has no attribute 'writerow'
Ich habe dann folgendes versucht:
import json
import csv
f = open('data.json')
data = json.load(f)
f.close()
f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
f.writerow(item) # ← changed
f.close()
Ich bekomme dann den Fehler:
sequence expected
Beispiel-JSON-Datei:
[{
"pk": 22,
"model": "auth.permission",
"fields": {
"codename": "add_logentry",
"name": "Can add log entry",
"content_type": 8
}
}, {
"pk": 23,
"model": "auth.permission",
"fields": {
"codename": "change_logentry",
"name": "Can change log entry",
"content_type": 8
}
}, {
"pk": 24,
"model": "auth.permission",
"fields": {
"codename": "delete_logentry",
"name": "Can delete log entry",
"content_type": 8
}
}, {
"pk": 4,
"model": "auth.permission",
"fields": {
"codename": "add_group",
"name": "Can add group",
"content_type": 2
}
}, {
"pk": 10,
"model": "auth.permission",
"fields": {
"codename": "add_message",
"name": "Can add message",
"content_type": 4
}
}
]
jq
, wie hier beschrieben: stackoverflow.com/questions/32960857/…Antworten:
Erstens verfügt Ihr JSON über verschachtelte Objekte, sodass es normalerweise nicht direkt in CSV konvertiert werden kann. Sie müssen das in etwa so ändern:
Hier ist mein Code, um daraus CSV zu generieren:
Sie erhalten folgende Ausgabe:
quelle
[u'
und umgeben']
. Was ist die Problemumgehung (ohne Nachbearbeitung)? wenn es eine gibt ... :)TypeError: a bytes-like object is required, not 'str'
beif.writerow(['pk', 'model', 'codename', 'name', 'content_type'])
f = csv.writer(open("test.csv", "w", newline=''))
Mit der
pandas
Bibliothek ist dies so einfach wie mit zwei Befehlen!So konvertieren Sie eine JSON-Zeichenfolge in ein Pandas-Objekt (entweder eine Serie oder einen Datenrahmen). Dann wurde angenommen, dass die Ergebnisse wie folgt gespeichert wurden
df
:Welches kann entweder einen String zurückgeben oder direkt in eine CSV-Datei schreiben.
Aufgrund der Ausführlichkeit früherer Antworten sollten wir uns alle bei Pandas für die Abkürzung bedanken.
quelle
.to_csv()
sehr leistungsfähig (z. B. kostenlose Spaltenfilterung). Ich muss Pandas lernen.orient='records'
muss gesetzt werden, aber jede Zeile vonfields
wird immer noch eine seindict
, was nicht das ist, was das OP angefordert hat.Ich gehe davon aus, dass Ihre JSON-Datei in eine Liste von Wörterbüchern dekodiert wird. Zuerst benötigen wir eine Funktion, die die JSON-Objekte reduziert:
Das Ergebnis der Ausführung dieses Snippets auf Ihrem JSON-Objekt:
ist
Nach dem Anwenden dieser Funktion auf jedes Diktat im Eingabearray von JSON-Objekten:
und Finden der relevanten Spaltennamen:
Es ist nicht schwer, dies über das CSV-Modul auszuführen:
Ich hoffe das hilft!
quelle
JSON kann eine Vielzahl von Datenstrukturen darstellen - ein JS- "Objekt" ähnelt in etwa einem Python-Diktat (mit Zeichenfolgenschlüsseln), ein JS- "Array" ähnelt in etwa einer Python-Liste, und Sie können sie so lange verschachteln, wie das endgültige " Blatt "Elemente sind Zahlen oder Zeichenfolgen.
CSV kann im Wesentlichen nur eine 2D-Tabelle darstellen - optional mit einer ersten Zeile von "Überschriften", dh "Spaltennamen", wodurch die Tabelle als Liste von Diktaten interpretiert werden kann, anstatt als normale Interpretation eine Liste von Listen (wieder können "Blatt" -Elemente Zahlen oder Zeichenfolgen sein).
Im allgemeinen Fall können Sie eine beliebige JSON-Struktur nicht in eine CSV übersetzen. In einigen besonderen Fällen können Sie (Array von Arrays ohne weitere Verschachtelung; Arrays von Objekten, die alle genau die gleichen Schlüssel haben). Welcher Sonderfall trifft gegebenenfalls auf Ihr Problem zu? Die Details der Lösung hängen davon ab, welchen Sonderfall Sie haben. Angesichts der erstaunlichen Tatsache, dass Sie nicht einmal erwähnen, welche zutreffend ist, habe ich den Verdacht, dass Sie die Einschränkung nicht berücksichtigt haben, und es gibt auch keinen brauchbaren Fall, und Ihr Problem ist unmöglich zu lösen. Aber bitte klären!
quelle
Eine generische Lösung, die jede JSON-Liste flacher Objekte in CSV übersetzt.
Übergeben Sie die Datei input.json als erstes Argument in der Befehlszeile.
quelle
Dieser Code sollte für Sie funktionieren, vorausgesetzt, Ihre JSON-Daten befinden sich in einer Datei mit dem Namen
data.json
.quelle
csv_file.writerow
(es gibtf.writerow
natürlich keine , ich nehme an, Sie haben dort einen Tippfehler gemacht!) Möchte eine Sequenz, kein Diktat - und in Ihrem Beispiel ist jedes Element ein Diktat. Dies würde für den ANDEREN Sonderfall funktionieren, wie ich in meiner Antwort festgestellt habe - wo die JSON-Datei ein Array von Arrays enthält; Es funktioniert nicht für ein Array von Objekten. Dies ist der Sonderfall, den Sie anscheinend zu lösen versuchen (für diesen ist ein erforderlichcsv.DictWriter
- und natürlich müssen Sie die Feldnamen extrahieren und eine Reihenfolge festlegen, um sie zu instanziieren ! -).Es wird einfach zu bedienen sein
csv.DictWriter()
, die detaillierte Implementierung kann folgendermaßen aussehen:Beachten Sie, dass dies voraussetzt, dass alle Ihre JSON-Objekte dieselben Felder haben.
Hier ist die Referenz, die Ihnen helfen kann.
quelle
Ich hatte Probleme mit Dans Lösungsvorschlag , aber das funktionierte für mich:
Wobei "test.json" Folgendes enthielt:
quelle
Verwendung
json_normalize
vonpandas
:test.json
encoding='utf-8'
ist möglicherweise nicht erforderlich.pathlib
Bibliothek.open
ist eine Methode vonpathlib
CSV-Ausgabe:
Andere Ressourcen für stärker verschachtelte JSON-Objekte:
quelle
Wie in den vorherigen Antworten erwähnt, besteht die Schwierigkeit beim Konvertieren von json in csv darin, dass eine json-Datei verschachtelte Wörterbücher enthalten kann und daher eine mehrdimensionale Datenstruktur gegenüber einer csv ist, bei der es sich um eine 2D-Datenstruktur handelt. Eine gute Möglichkeit, eine mehrdimensionale Struktur in eine CSV umzuwandeln, besteht darin, mehrere CSVs zu haben, die mit Primärschlüsseln verknüpft sind.
In Ihrem Beispiel enthält die erste CSV-Ausgabe die Spalten "pk", "model" und "fields" als Spalten. Die Werte für "pk" und "model" sind leicht zu ermitteln. Da die Spalte "fields" jedoch ein Wörterbuch enthält, sollte es sich um eine eigene CSV handeln. Da "Codename" als Primärschlüssel angezeigt wird, können Sie diese als Eingabe verwenden für "Felder", um die erste CSV zu vervollständigen. Die zweite CSV enthält das Wörterbuch aus der Spalte "Felder" mit dem Codenamen als Primärschlüssel, mit dem die beiden CSVs miteinander verbunden werden können.
Hier ist eine Lösung für Ihre JSON-Datei, die verschachtelte Wörterbücher in 2 CSVs konvertiert.
quelle
Ich weiß, dass diese Frage schon lange nicht mehr gestellt wurde, aber ich dachte, ich könnte die Antwort aller anderen ergänzen und einen Blog-Beitrag teilen, der meiner Meinung nach die Lösung auf sehr präzise Weise erklärt.
Hier ist der Link
Öffnen Sie eine Datei zum Schreiben
Erstellen Sie das CSV-Writer-Objekt
Stellen Sie sicher, dass Sie die Datei schließen, um den Inhalt zu speichern
quelle
Es ist keine sehr kluge Methode, aber ich hatte das gleiche Problem und das hat bei mir funktioniert:
quelle
Alecs Antwort ist großartig, aber es funktioniert nicht, wenn es mehrere Verschachtelungsebenen gibt. Hier ist eine modifizierte Version, die mehrere Verschachtelungsebenen unterstützt. Außerdem werden die Headernamen etwas schöner, wenn das verschachtelte Objekt bereits einen eigenen Schlüssel angibt (z. B. Firebase Analytics / BigTable / BigQuery-Daten):
quelle
Das funktioniert relativ gut. Es flacht den JSON ab, um ihn in eine CSV-Datei zu schreiben. Verschachtelte Elemente werden verwaltet :)
Das ist für Python 3
genießen.
quelle
json.loads
nicht, ich habe es zum Laufen gebrachtjson.load
, was ein Listenobjekt ergibt. Drittens gingen verschachtelte Elemente verloren.Mein einfacher Weg, dies zu lösen:
Erstellen Sie eine neue Python-Datei wie: json_to_csv.py
Fügen Sie diesen Code hinzu:
Speichern Sie nach dem Hinzufügen dieses Codes die Datei und führen Sie sie am Terminal aus:
Ich hoffe das hilft dir.
TSCHÜSS!
quelle
Überraschenderweise stellte ich fest, dass keine der hier veröffentlichten Antworten alle möglichen Szenarien korrekt behandelt (z. B. verschachtelte Dikte, verschachtelte Listen, Keine Werte usw.).
Diese Lösung sollte in allen Szenarien funktionieren:
quelle
Versuche dies
quelle
Dieser Code funktioniert für jede gegebene JSON-Datei
quelle
Die Antwort von Alec McGail wurde geändert, um JSON mit Listen zu unterstützen
Vielen Dank!
quelle
quelle
Wenn wir das folgende Beispiel für die Konvertierung der Datei im JSON-Format in eine CSV-formatierte Datei betrachten.
Der folgende Code konvertiert die JSON-Datei (data3.json) in eine CSV-Datei (data3.csv).
Der oben genannte Code wurde im lokal installierten Pycharm ausgeführt und hat die JSON-Datei erfolgreich in die CSV-Datei konvertiert. Hoffe diese Hilfe beim Konvertieren der Dateien.
quelle
Da die Daten in einem Wörterbuchformat zu sein scheinen, sollten Sie tatsächlich csv.DictWriter () verwenden, um die Zeilen mit den entsprechenden Kopfzeileninformationen tatsächlich auszugeben. Dies sollte eine etwas einfachere Konvertierung ermöglichen. Der Parameter fieldnames würde dann die Reihenfolge ordnungsgemäß einrichten, während die Ausgabe der ersten Zeile als Überschriften es ermöglichen würde, sie später von csv.DictReader () zu lesen und zu verarbeiten.
Zum Beispiel verwendet Mike Repass
Ändern Sie jedoch einfach die Ersteinrichtung in output = csv.DictWriter (Dateigruppe, Feldnamen = Daten [0] .keys ()).
Beachten Sie, dass Sie möglicherweise explizit Feldnameneinträge erstellen müssen, da die Reihenfolge der Elemente in einem Wörterbuch nicht definiert ist. Sobald Sie das tun, wird der Writerow funktionieren. Die Schreibvorgänge funktionieren dann wie ursprünglich gezeigt.
quelle
Leider habe ich nicht den Ruf, einen kleinen Beitrag zur erstaunlichen Antwort von @Alec McGail zu leisten. Ich habe Python3 verwendet und musste die Karte nach dem Kommentar von @Alexis R in eine Liste konvertieren.
Zusätzlich habe ich festgestellt, dass der CSV-Writer der Datei eine zusätzliche CR hinzugefügt hat (ich habe eine leere Zeile für jede Zeile mit Daten in der CSV-Datei). Die Lösung war sehr einfach, nachdem @Jason R. Coombs auf diesen Thread geantwortet hatte: CSV in Python, das einen zusätzlichen Wagenrücklauf hinzufügt
Sie müssen einfach den Parameter lineterminator = '\ n' zum csv.writer hinzufügen. Es wird sein:
csv_w = csv.writer( out_file, lineterminator='\n' )
quelle
Mit diesem Code können Sie eine JSON-Datei in eine CSV-Datei konvertieren. Nach dem Lesen der Datei konvertiere ich das Objekt in einen Pandas-Datenrahmen und speichere es dann in einer CSV-Datei
quelle
Ich komme vielleicht zu spät zur Party, aber ich denke, ich habe mich mit dem ähnlichen Problem befasst. Ich hatte eine JSON-Datei, die so aussah
Ich wollte nur einige Schlüssel / Werte aus dieser JSON-Datei extrahieren. Also habe ich den folgenden Code geschrieben, um dasselbe zu extrahieren.
Ich hoffe das wird helfen. Einzelheiten zur Funktionsweise dieses Codes finden Sie hier
quelle
Dies ist eine Modifikation der Antwort von @ MikeRepass. Diese Version schreibt die CSV in eine Datei und funktioniert sowohl für Python 2 als auch für Python 3.
quelle