Python:将两个csv加入一个嵌套的json Python中

时间:2017-03-24 02:42:45

标签: python json csv

我想在python中将CSV转换为JSON。我能够将简单的csv文件转换为json,但无法将两个csv连接到一个嵌套的json中。

.errorMessage {
    color: red;
}

输出应该是:

    [{
    "empid": "e123",
    "empname": "adam",
    "empemail": "adam@gmail.com",
    "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)

它不起作用。 需要帮助。感谢

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

列不匹配:

empid | empname | empemail

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

empid | itemid | itemname | itemqty

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

我们通常使用,代替CSV中的|

此外,您需要将'替换为JSON中的"