2016-08-22 5 views
1

Ich habe eine JSON-Datei mit einem Wörterbuch mit vielen Schlüssel-Wert-Paaren. Ich möchte es in eine einzige CSV schreiben. Eine Möglichkeit, dies zu tun, besteht darin, einfach durch jeden Schlüssel zu iterieren:Wörterbuch von JSON zu CSV

csvwriter.writerow([f["dict"]["key1"], f["dict"]["key2"], 
        f["dict"]["key3"], ... ]) 

Dies wäre sehr mühsam.

Eine andere Möglichkeit ist einfach

csvwriter.writerow([f["dict"].values()]) 

zu verwenden, aber es alles in eine Spalte der CSV-Datei schreibt, die nicht hilfreich ist.

Gibt es eine Möglichkeit, dass ich jeden Wert in eine Spalte der CSV-Datei schreiben kann?

+0

Ist die Reihenfolge der Schlüssel in der Datei müssen JSON zu erhalten? Wenn nicht, was bestimmt die Reihenfolge, in der sie in den Spalten der CSV-Datei erscheinen sollen? – martineau

+0

nein. scheint zufällig zu sein. – wwl

+0

Hmm, scheint zu haben/erlauben die Daten erscheinen in zufälligen Spalten der CSV würde es schwierig machen, danach zu bearbeiten. – martineau

Antwort

3

Sie wollen wahrscheinlich ein csv.DictWriter

Das Beispiel in der offiziellen Dokumentation verwenden, ist ziemlich geradlinig:

import csv 

with open('names.csv', 'w') as csvfile: 
    fieldnames = ['first_name', 'last_name'] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 

    writer.writeheader() 
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) 
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) 
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'}) 

Beachten Sie, dass fieldnames an den Konstruktor bereitstellen muss. Wenn Sie sicher sind, dass alle Ihre Diktate die gleichen Schlüssel haben und sich nicht um die Reihenfolge der Ausgabe kümmern, können Sie einfach list(first_dict) verwenden, um die Spaltennamen zu erhalten, ansonsten sollten Sie eine Möglichkeit zur Festlegung finden sie expliziter.

1

Pandas ist gut für diese Art von Sache.

Ich würde die JSON-Datei in einen Pandas-Datenrahmen (link) lesen. Dann schreibe es als CSV (link).

import pandas as pd 

#read in the json 
df = pd.read_json("json_path_here") 

# write the csv 
df.to_csv("csv_path_here") 
1

Entspricht Code:

csvwriter.writerow(f["dict"].values()) 

Hinweis: Dazu sollte Ihr Wörterbuch von collections.OrderedDict sein, weil Python die Standard-Wörterbücher nicht bestellt werden. Daher haben Sie in jeder Zeile eine andere Reihenfolge.

Alternativ, besserer Weg, dies zu erreichen, wird mit DictWriter (für die Sie bestellt dict nicht brauchen):

csvwriter.writerow(f["dict"]) 
+0

Ich benutze Python 2.7 und wenn ich das Sternchen eingebe, heißt es "SyntaxError: Ungültige Syntax". Gibt es etwas, was ich tun muss? – wwl

+1

Kannst du mir den Wert von: 'f' mitteilen? Tue einfach "print f" und teile es mit mir –

+0

{"stats": {"item1": 3153, "totalPlayerScore": 0, ...}} – wwl

0

Es ist nicht notwendig, csv.DictWriter zu verwenden. Das Folgende, das sowohl in Python 2 als auch in 3 funktioniert, zeigt, wie eine CSV-Datei erstellt wird, die automatisch die Schlüssel/Wert-Paare in derselben Reihenfolge wie in der JSON-Datei enthält (anstelle einer manuell definierten fieldnames Liste):

from collections import OrderedDict 
import csv 
import json 
from io import StringIO 

# in-memory JSON file for testing 
json_file = StringIO(u'{"dict": {"First": "value1", "Second": "value2",' 
           '"Third": "value3", "Fourth": "value4"}}') 

# read file and preserve order by using OrderedDict 
json_obj = json.load(json_file, object_pairs_hook=OrderedDict) 

with open('pairs.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile) 
    writer.writerow(json_obj["dict"].keys()) # header row 
    writer.writerow(json_obj["dict"].values()) 

Inhalt von pairs.csv Datei geschrieben:

First,Second,Third,Fourth 
value1,value2,value3,value4