2016-10-28 11 views
1

を読んだので、私はJSONを読み込むプログラムを持って、それを平らにし、CSVをダンプします:は、パイソンを使用してCSVファイルに列ヘッダを追加するJSON

import json 
import unicodecsv as csv 
import sys 
import glob 
import os 
from flatten_json import flatten_json 

def createcolumnheadings(cols): 
    #create column headings 
    columns = cols.keys() 
    columns = list(set(columns)) 
    return columns 

doOnce=True 

path=os.chdir(sys.argv[1]) 

for f in glob.glob("smallR.txt"): 
    fName=os.path.splitext(f)[0] 
    out_file= open('csv/' + fName+'.csv', 'wb') 
    csv_w = csv.writer(out_file, delimiter="\t", encoding='utf-8' ) 

    with open(f, 'r') as handle: 
     for line in handle: 
      data = json.loads(line)   
      flatdata =flatten_json(data)    
      if doOnce: 
       columns=createcolumnheadings(flatdata) 
       columns.insert(0,'racism') 
       csv_w.writerow(columns)     
       doOnce=False 
      flatdata['racism']= 0 
      csv_w.writerow(flatdata.get(x, u'') for x in columns) 

これは、1つの問題で、[OK]を動作します。 私のプログラムは、smallR.txtの最初の行から列の見出しを取得します(プラス 'Racism'列を追加します)。

後者のデータの一部(smallR.txt here)には、異なる列があります。この結果、結果は正しくありません。small.csv hereを参照してください。

私のプログラムを後の行で見つかる新しい列見出しを扱うための簡単な方法はありますか?

答えて

1

あなたが可能なすべての列を取得するためには、最初のファイル全体をスキャンする必要があり、その場合には:メモリで

with open(f, 'r') as handle: 
    data = [json.loads(line) for line in handle] 

columns = ['racism'] + list({k for entry in data for k in entry.keys()}) 

csv_w.writerow(columns) 
for entry in entries: 
    csv_w.writerow(entry.get(c, '') for c in columns) 

このロードし、すべてのデータ。これはあなたに受け入れられない場合は、ファイルを二度読むかもしれない:1の列を取得するには、別の読み取りおよび書き込みに:

with open(f, 'r') as handle: 
    columns = ['racism'] + list({k for line in handle for k in json.load(line).keys()}) 
csv_w.write(columns) 

with open(f, 'r') as handle: 
    for line in handle: 
     entry = json.loads(line) 
     csv_w.write(entry.get(c, '') for c in columns) 

flatten_json関数定義はので、私はそれだけが何をするかを推測することができます欠けています。

+0

ありがとうJavier、ファイルが巨大なので、私はあなたの2番目の方法を行って行きます。 Flatten_jsonは[ここ]からのインポートです(https://medium.com/@amirziai/flattening-json-objects-in-python-f5343c794b10#.v8fb0z7bt) – schoon

関連する問題