2017-03-24 67 views
0

我想在Python中將CSV轉換爲JSON。我能夠將簡單的csv文件轉換爲json,但無法將兩個csv連接到一個嵌套的json中。Python:將兩個CSV添加到一個嵌套的JSON Python

emp.csv: 
empid | empname | empemail 
e123 | adam | [email protected] 
e124 | steve | [email protected] 
e125 | brian | [email protected] 
e126 | mark | [email protected] 

items.csv: 
empid | itemid | itemname | itemqty 
e123 | itm128 | glass | 25 
e124 | itm130 | bowl | 15 
e123 | itm116 | book | 50 
e126 | itm118 | plate | 10 
e126 | itm128 | glass | 15 
e125 | itm132 | pen | 10 

輸出應該是這樣的:

 
    [{ 
    "empid": "e123", 
    "empname": "adam", 
    "empemail": "[email protected]", 
    "items": [{ 
     "itemid": "itm128", 
     "itmname": "glass", 
     "itemqty": 25 
    }, { 
     "itemid": "itm116", 
     "itmname": "book", 
     "itemqty": 50 
    }] 
}, 
and similar for others]

,我寫的代碼:

 
import csv 
import json 

empcsvfile = open('emp.csv', 'r') 
jsonfile = open('datamodel.json', 'w') 

itemcsvfile = open('items.csv', 'r') 

empfieldnames = ("empid","name","phone","email") 
itemfieldnames = ("empid","itemid","itemname","itemdesc","itemqty") 

empreader = csv.DictReader(empcsvfile, empfieldnames) 
itemreader = csv.DictReader(itemcsvfile, itemfieldnames) 

output=[]; 
empcount=0 
for emprow in empreader: 
    output.append(emprow) 
    for itemrow in itemreader: 
     if(itemrow["empid"]==emprow["empid"]): 
      output.append(itemrow) 
    empcount = empcount +1 
print output 
json.dump(output, jsonfile,sort_keys=True) 

,它亙古不變的工作。 需要幫助。謝謝

+0

是CSV文件 - 逗號分隔或管道分隔? – Rocky

+0

我運行了你的代碼,並提出了一些打印語句,這是什麼輸出 - {'empid':'empid | empname | empemail','phone':None,'name':None,'email':None} {'empid':'e123 | adam | [email protected]','phone':None,'name':None,'email':None} {'empid':'e124 |史蒂夫| [email protected]','phone':None,'name':None,'email':None} {'empid':'e125 |布萊恩| [email protected]','phone':None,'name':None,'email':None} {'empid':'e126 | mark | [email protected]','phone':None,'name':None,'email':None} 所以,正如你看到的那樣,因爲它是管道分離的,所以整行被認爲是empid – Rocky

+0

感謝你的提問。 – Kevin

回答

0

好的,所以你有幾個問題。首先,您需要爲CSV文件指定分隔符。您使用的是|字符,默認情況下,python可能會預期,。所以你需要這樣做:

empreader = csv.DictReader(empcsvfile, empfieldnames, delimiter='|') 

其次,你沒有追加到員工字典的項目。您可能應該在每個員工字典對象上創建一個名爲'items'的鍵並將這些項追加到該列表中。像這樣:

for emprow in empreader: 
    emprow['items'] = [] # create a list to hold items for this employee 
    ... 
    for itemrow in itemreader: 
     ... 
     emprow['items'].append(itemrow) # append an item for this employee 

第三,每次循環通過一名員工時,都需要返回到項目csv文件的頂部。你必須認識到,一旦python讀到一個文件的底部,它將不會回到下一個循環的頂部。你必須告訴它這樣做。現在,您的代碼會在處理第一名員工後通過item.csv文件讀取,然後停留在文件底部,供所有其他員工使用。您必須使用seek(0)來告訴它回到每個員工的文件頂部。

for emprow in empreader: 
    emprow['items'] = [] 
    output.append(emprow) 
    itemcsvfile.seek(0) 
    for itemrow in itemreader: 
     if(itemrow["empid"]==emprow["empid"]): 
      emprow['items'].append(itemrow) 
+0

像魅力一樣工作。謝謝。 – Kevin

0

列不匹配:

empid | empname | empemail 

empfieldnames = ("empid","name","phone","email") 

empid | itemid | itemname | itemqty 

itemfieldnames = ("empid","itemid","itemname","itemdesc","itemqty") 

我們使用,通常代替|在CSV

更重要的是,你需要更換'"在JSON