2016-09-14 49 views
1

我有多個文件,每個文件包含多個高度嵌套的json 。這樣一個文件的兩個第一行的樣子:多個jsons到csv

{ 
"u":"28", 
"evv":{ 
     "w":{ 
      "1":400, 
      "2":{ 
       "i":[{ 
         "l":14, 
         "c":"7", 
         "p":"4" 
         } 
        ] 
       } 
      } 
     } 
} 
{ 
"u":"29", 
"evv":{ 
     "w":{ 
      "3":400, 
      "2":{ 
       "i":[{ 
         "c":14, 
         "y":"7", 
         "z":"4" 
         } 
        ] 
       } 
      } 
     } 
} 

他們實際上是行,我只是寫他們在這裏這種方式更多的知名度。

我的問題是:

有擅長什麼辦法所有這些文件轉換爲一個(或多個,即每個文件一個)CSV/...?

有沒有什麼簡單的方法,不需要寫幾十個或幾百行Python中,具體到我的文件,以所有這些文件轉換爲一個(每個文件或多個,即一個)CSV/excel ...?一個例子是使用外部庫,腳本......來處理這個特定的任務,而不管字段的名稱。

陷阱是一些元素不會出現在每一行中。例如,對於「i」密鑰,我們在第一個json中有3個字段(l,c,p),第二個字段(c,y,z)中有3個字段。理想情況下,csv應包含儘可能多的列(例如evv.w.2.il,evv.w.2.ic,evv.w.2.ip,evv.w.2.iy,evv.w. 2.iz)存在每csv行有(許多)空值的風險。

一個可能的CSV輸出這個例子將有以下欄目:

u, evv.w.1, evv.w.3, evv.w.2.i.l, evv.w.2.i.c, evv.w.2.i.p, evv.w.2.i.y, evv.w.2.i.z 

任何想法/參考,歡迎:)

感謝

+0

是的,它是可能的 - 我建議在看蟒蛇的[JSON](https://docs.python.org/2/library/json.html)和[CSV] (https://docs.python.org/2/library/csv.html)模塊,並試圖編寫一個腳本來完成自己想做的事情。如果遇到困難,請回到這裏,我們將幫助您調試程序 –

+0

請編輯你的問題,並顯示csv文件應該包含的示例數據和你寫的代碼,以便自己去做。 – martineau

+0

@HaydenSchiff,我知道這兩個模塊的存在,並且我知道我可以用它們來做e xactly我想要的,儘管它可能非常麻煩。我的問題是,一個腳本是否已經寫好 – Salem

回答

1

沒有,沒有通用的程序,它正是你要求什麼。

但是,您可以編寫一個可以執行此操作的Python程序。

這個程序可能會做你想做的。它沒有任何特定於您的密鑰名稱的代碼,但它是特定於您的文件格式的。

  • 它可以在命令行上使用多個文件。
  • 每個文件被假定每行有一個JSON對象。
  • 它使JSON對象變平,用「」連接標籤。「

 

import fileinput 
import json 
import csv 


def flattify(d, key=()): 
    if isinstance(d, list): 
     result = {} 
     for i in d: 
      result.update(flattify(i, key)) 
     return result 
    if isinstance(d, dict): 
     result = {} 
     for k, v in d.items(): 
      result.update(flattify(v, key + (k,))) 
     return result 
    return {key: d} 

total = [] 
for line in fileinput.input(): 
    if(line.strip()): 
     line = json.loads(line) 
     line = flattify(line) 
     line = {'.'.join(k): v for k, v in line.items()} 
     total.append(line) 

keys = set() 
for d in total: 
    keys.update(d) 

with open('result.csv', 'w') as output_file: 
    output_file = csv.DictWriter(output_file, sorted(keys)) 
    output_file.writeheader() 
    output_file.writerows(total) 
+0

令人驚訝的是,謝謝:) 我不認爲這會處理json中列表中的多個條目(例如evv.w.2.i.一種方法是創建所需的列數,例如: ' if isinstance(d,list): d = {str(i):j for i,j in枚舉(d)} return flattify(d,key = key) ' – Salem

1

請檢查該(python3)解決方案工程爲你。

import json 
import csv 

with open('test.json') as data_file: 
    with open('output.csv', 'w', newline='') as fp: 
     for line in data_file: 
      data = json.loads(line) 
      output = [[data['u'], data['evv']['w'].get('1'), data['evv']['w'].get('3'), 
         data['evv']['w'].get('2')['i'][0].get('l'), data['evv']['w'].get('2')['i'][0].get('c'), 
         data['evv']['w'].get('2')['i'][0].get('p'), data['evv']['w'].get('2')['i'][0].get('y'), 
         data['evv']['w'].get('2')['i'][0].get('z')]] 
      a = csv.writer(fp, delimiter=',') 
      a.writerows(output) 

test.json

{ "u": "28", "evv": {  "w": {   "1": 400,   "2": {    "i": [{     "l": 14,     "c": "7",     "p": "4"    }]   }  } }} 
{"u":"29","evv":{  "w":{   "3":400,   "2":{     "i":[{      "c":14,      "y":"7",      "z":"4"      }      ]     }   }  }} 

輸出

python3 pyprog.py 
[email protected] ~/P/pyprog> more output.csv 
28,400,,14,7,4,, 
29,,400,,14,,7,4