2016-08-22 13 views
1

私は多くのキーと値のペアを持つ辞書を含むJSONファイルを持っています。私はそれを1つのCSVに書きたいと思う。これを行う1つの方法は、各キーを繰り返し実行することです。JSONからCSVへの辞書

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

これは非常に面倒です。

もう一つの可能​​性は

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

を使用することですが、それは役に立たないCSVファイルの1列にすべてを書き込みます。

CSVファイルの1つの列に各値を書き込む方法はありますか?

+0

JSONファイル内のキーの順序をい保存する必要がありますか?そうでない場合は、CSVファイルの列に表示される順序を決定する要因は何ですか? – martineau

+0

番号。ランダムなようです。 – wwl

+0

ええと、CSVのランダムな列に表示されるデータを許可/許可すると、後で処理するのが難しくなるようです。 – martineau

答えて

3

おそらく、公式ドキュメントにcsv.DictWriter

例を使用するには、かなりストレートフォワードです:あなたコンストラクタにfieldnamesを提供しなければならない

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'}) 

注意。すべての辞書に同じキーがあり、出力の順番に気にしない場合は、list(first_dict)を使用して列名を取得することができます。そうでなければ、指定する方法を考え出しますそれらをより明示的に表現する。

1

Pandasこの種のものには適しています。

私はJSONファイルをパンダのデータフレーム(link)に読み込みます。それを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

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

注:Pythonのデフォルトの辞書が注文されていないので、はこのために、あなたの辞書はcollections.OrderedDictでなければなりません。したがって、あなたは各行に異なる順序で終わるでしょう。これを達成するための

また、より良い方法は、(あなたが注文したのdictを必要としないため)DictWriterを使用している:

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

私はPython 2.7を使用しています。アスタリスクを入力すると、「SyntaxError:Invalid Syntax」と表示されます。私は何かする必要がありますか? – wwl

+1

あなたは私に「f」という値を教えてもらえますか? 「print f」を実行して私と共有してください –

+0

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

0

それはcsv.DictWriterを使用する必要はありません。 Python 2と3の両方で動作する以下は、手動で定義されたfieldnamesリストを必要とするのではなく、JSONファイルに表示されるのと同じ順序でキーと値のペアを自動的に持つCSVファイルを作成する方法を示しています。書かれたpairs.csvファイルの

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

内容:

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