我有一个包含大量列的CSV文件。 一些列是相同的,但我想将它们转换为JSON对象,它们都位于同一个数组下。
例如在CSV中:
firstname,lastname,pet,pet,pet
Joe, Dimaggio, dog, cat
Pete, Rose, turtle, cat
Jackie, Robinson, dog
我想让JSON成为
{ firstname: Joe,
lastname: Dimaggio,
pets: ["dog", "cat"]
},
{ firstname: Pete,
lastname: Rose,
pets: ["turtle", "cat"]
},
{ firstname: Jackie,
lastname: Robinson,
pets: ["dog"]
}
我正在尝试编写一个简单的Python脚本来执行此操作,但我遇到了问题。
这是我到目前为止所得到的:
import csv
import json
csvfile = open('userdata.csv', 'r')
jsonfile = open('userdata.json', 'w')
fieldnames = ("firstname", "lastname", "pet", "pet", "pet");
reader = csv.DictReader( csvfile, fieldnames)
record = {}
for row in reader:
record['firstname'] = row['firstname']
record['lastname'] = row['lastname']
record['pets'] = json.JSONEncoder().encode({"pets": [row['pet'], row['pet'], row['pet'], row['pet'], row['pet']]});
json.dump(record, jsonfile, indent=4)
##json.dump(json.loads(json.JSONEncoder(record)), jsonfile, indent=4)
print "something worked"
但这很有趣,因为它将pets
打印为名为pets
的对象内的数组。
我无法弄清楚如何在对象`pets之外获取数组pets
。它还在数组项中添加了反斜杠
{
"firstname": "Joe",
"lastname": "Dimaggio",
"pets": "{\"pets\": [\"dog\", \"cat\"]}"
}
答案 0 :(得分:6)
这是因为你正在对它进行编码,然后使用基本上编码两次的json.JSONEncoder().encode(...)
。删除import csv
import json
csvfile = open('userdata.csv', 'r')
jsonfile = open('userdata.json', 'w')
fieldnames = ("firstname", "lastname", "pet", "pet", "pet");
reader = csv.DictReader( csvfile, fieldnames)
record = {}
for row in reader:
record['firstname'] = row['firstname']
record['lastname'] = row['lastname']
record['pets'] = [[row['pet'], row['pet'], row['pet'], row['pet'], row['pet']]
# Remove blank entries
record['pets'] = [x for x in record['pets'] if x is not '']
json.dumps(record, jsonfile, indent=4)
print "something worked"
,它应该可以正常工作。
phostMessage(iframe, someObj, callback);
你看到的反斜杠来自于转义json字符串,这是两次序列化的结果。