2016-12-16 12 views
1

この質問は何度も尋ねられています。私はいくつかの解決策を試しましたが、問題を解決できませんでした。Pythonで入れ子になったJSONをCSVファイルに変換する

大きなネストされたJSONファイル(1.4GB)があり、それをフラットにしてからCSVファイルに変換したいと考えています。

JSON構造は次のようである:

{ 
    "company_number": "12345678", 
    "data": { 
    "address": { 
     "address_line_1": "Address 1", 
     "locality": "Henley-On-Thames", 
     "postal_code": "RG9 1DP", 
     "premises": "161", 
     "region": "Oxfordshire" 
    }, 
    "country_of_residence": "England", 
    "date_of_birth": { 
     "month": 2, 
     "year": 1977 
    }, 
    "etag": "26281dhge33b22df2359sd6afsff2cb8cf62bb4a7f00", 
    "kind": "individual-person-with-significant-control", 
    "links": { 
     "self": "/company/12345678/persons-with-significant-control/individual/bIhuKnFctSnjrDjUG8n3NgOrl" 
    }, 
    "name": "John M Smith", 
    "name_elements": { 
     "forename": "John", 
     "middle_name": "M", 
     "surname": "Smith", 
     "title": "Mrs" 
    }, 
    "nationality": "Vietnamese", 
    "natures_of_control": [ 
     "ownership-of-shares-50-to-75-percent" 
    ], 
    "notified_on": "2016-04-06" 
    } 
} 

私はこれがpandasモジュールで実現するのは簡単ですが、私はそれに慣れていないだということを知っています。これはただの短いバージョンであることを

company_number, address_line_1, locality, country_of_residence, kind, 

12345678, Address 1, Henley-On-Thamed, England, individual-person-with-significant-control 

注:

EDITEDは

所望の出力は次のようなものでなければなりません。出力にはすべてのフィールドが含まれている必要があります。

+0

希望の出力を表示できますか? – zipa

+0

私は投稿 – Porjaz

+0

を編集しました。まず自分自身でエラーを修正する必要がありますが、エラーは発生せず、jsonは正常に読み込まれました。 – Matthias

答えて

1

あなたは次のようにちょうどすべてのリーフノードのリストを返すために、JSONの構造を解析することによってこれを行うことができます:

import json 
import csv 

def get_leaves(item, key=None): 
    if isinstance(item, dict): 
     leaves = [] 
     for i in item.keys(): 
      leaves.extend(get_leaves(item[i], i)) 
     return leaves 
    elif isinstance(item, list): 
     leaves = [] 
     for i in item: 
      leaves.extend(get_leaves(i, key)) 
     return leaves 
    else: 
     return [(key, item)] 


with open('json.txt') as f_input, open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 
    write_header = True 

    for entry in json.load(f_input): 
     leaf_entries = sorted(get_leaves(entry)) 

     if write_header: 
      csv_output.writerow([k for k, v in leaf_entries]) 
      write_header = False 

     csv_output.writerow([v for k, v in leaf_entries]) 

あなたのJSONデータは、あなたが与えている形式のエントリのリストである場合には、

address_line_1,company_number,country_of_residence,etag,forename,kind,locality,middle_name,month,name,nationality,natures_of_control,notified_on,postal_code,premises,region,self,surname,title,year 
Address 1,12345678,England,26281dhge33b22df2359sd6afsff2cb8cf62bb4a7f00,John,individual-person-with-significant-control,Henley-On-Thames,M,2,John M Smith,Vietnamese,ownership-of-shares-50-to-75-percent,2016-04-06,RG9 1DP,161,Oxfordshire,/company/12345678/persons-with-significant-control/individual/bIhuKnFctSnjrDjUG8n3NgOrl,Smith,Mrs,1977 
Address 1,12345679,England,26281dhge33b22df2359sd6afsff2cb8cf62bb4a7f00,John,individual-person-with-significant-control,Henley-On-Thames,M,2,John M Smith,Vietnamese,ownership-of-shares-50-to-75-percent,2016-04-06,RG9 1DP,161,Oxfordshire,/company/12345678/persons-with-significant-control/individual/bIhuKnFctSnjrDjUG8n3NgOrl,Smith,Mrs,1977 

注:

:あなたは、Python 3.xを使用している場合は、次の行を変更する次のように出力を取得する必要があります
with open('json.txt', newline='') as f_input, open('output.csv', 'w', newline='') as f_output: 
+0

これは、ネストされたキー値がjsonファイル全体で一貫していないと問題を引き起こす可能性があると思います。構造体の1つにフィールドがない場合、その行のデータはオフセットされます。 –

+0

このコードはjsonデータでは機能しませんでした。私はこのキーだけを解析することができます: "K6v8Ht6nXCjaO_ApNGr"あなたはそれについて私を助けることができますか?お願いします。私のPythonバージョンは3.6.4 – tpbafk

+0

@tpbafkです。Python 3.xの場合、あなたは 'open()'コマンドを少し変更する必要がありますが(私はスクリプトを更新しました)、あなたのJSONを見ることなく、私はできませんそれはすべてを解析していない理由を伝えることができます。おそらく新しい質問を始めるべきでしょうか? –

関連する問題