我想在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)
它不起作用。 需要帮助。感谢
答案 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中的"