2017-08-04 36 views
0

我正嘗試使用python從CSV創建JSON。我遇到的這個問題是從數據中分離標題的方法。我當前的代碼是:Python將CSV轉換爲帶有標頭的JSON

import csv 
import json 

with open('input.csv') as f: 
    columns = ("Column 1", "Column 2") 
    reader = csv.DictReader(f, columns) 
    rows = list(reader) 
with open('output.json', 'w') as f: 
    json.dump(rows, f, indent=4) 

但這返回

[ 
{ 
    "Column 2": null, 
    "Column 1": "Title" 
}, 
{ 
    "Column 2": " data2", 
    "Column 1": "data1" 
}, 
{ 
    "Column 2": " data4", 
    "Column 1": "data3" 
}, 
{ 
    "Column 2": " data6", 
    "Column 1": "data5" 
} 

]

,而不是

[ 
    "Title1": { 
     { 
      "Column 2": " data2", 
      "Column 1": "data1" 
     }, 
     { 
      "Column 2": " data4", 
      "Column 1": "data3" 
     }, 
     { 
      "Column 2": " data6", 
      "Column 1": "data5" 
     } 
    } 
] 

繼承人的CSV會是什麼樣子供參考的例子:

Title 
data1, data2 
data3, data4 
data5, data6 
Title2 
data1, data2 
data3, data4 
data5, data6 
+3

你需要明確地建立另一種數據結構。一個字典讀者可能無法幫助你。 –

+0

你的例子不太可能。你把「Tittle1」作爲沒有鍵的字典的關鍵字。 – dawg

回答

0

而不是僅僅使用list,你需要建立嵌套數據結構自己。這裏是你可以做的一種方式:

import csv 
import json 

with open('input.csv') as f: 
    columns = ("Column 1", "Column 2") 
    reader = csv.DictReader(f, columns) 
    tree = {} 
    for row in reader: 
     if row["Column 2"] is None: 
      current = [] 
      tree[row["Column 1"]] = current 
     else: 
      current.append(row) 

當「標題」行被發現(一個在第二欄是空的),一個新的列表被添加到樹。更多的行被添加到該列表中,直到出現另一個「標題」行,並且開始新的列表。

+0

謝謝。這大部分工作。爲了符合JSON語法,我必須將樹轉換爲字符串,然後將所有單引號替換爲雙引號。然後我把它寫到一個json文件來獲得我想要的輸出。 – adaelemans

+0

爲什麼不直接使用'json.dump'? –

+0

你說得對。這實際上效果更好。謝謝 – adaelemans

0

您需要將您的數據傳遞給不同的結構。

喜歡的東西:

data={} 
with open('/tmp/f.csv') as f: 
    reader=csv.reader(f) 
    for sl in (row for row in reader): 
     if len(sl)==1: 
      key=sl[0] 
      data[key]=[] 
     else: 
      data[key].append({"Column {}".format(i):e for i, e in enumerate(sl,1)}) 

>>> json.dumps(data, f, indent=4) 
{ 
    "Title2": [ 
     { 
      "Column 2": " data2", 
      "Column 1": "data1" 
     }, 
     { 
      "Column 2": " data4", 
      "Column 1": "data3" 
     }, 
     { 
      "Column 2": " data6", 
      "Column 1": "data5" 
     } 
    ], 
    "Title": [ 
     { 
      "Column 2": " data2", 
      "Column 1": "data1" 
     }, 
     { 
      "Column 2": " data4", 
      "Column 1": "data3" 
     }, 
     { 
      "Column 2": " data6", 
      "Column 1": "data5" 
     } 
    ] 
} 
0

你能做這樣的事嗎?

titles = ['Title', 'Title2'] 
output = {} 
for line in f: 
    if line[0] in titles: 
     title = line[0] 
     output[title] = {} 
     output[title]["Column 1"] = [] 
     output[title]["Column 2"] = [] 
    else: 
     output[title]["Column 1"].append(line[0]) 
     output[title]["Column 2"].append(line[1]) 

返回:

{ 'Title': { 'Column 1': ['data1', 'data3', 'data5'], 
       'Column 2': ['data2', 'data4', 'data6']}, 
    'Title2': { 'Column 1': ['data1', 'data3', 'data5'], 
        'Column 2': ['data2', 'data4', 'data6']}}