在Python中将CSV转换为重新构造的JSON
我有一个包含以下内容的CSV文件: 资料来源: 我的目标是从中生成一个JSON对象,如下所示:在Python中将CSV转换为重新构造的JSON,python,json,python-2.7,csv,Python,Json,Python 2.7,Csv,我有一个包含以下内容的CSV文件: 资料来源: 我的目标是从中生成一个JSON对象,如下所示: { "district":{ "Sindhupalchok":{ "Causalities":{ "Total No. of Houses":66688, "Total Population":287798, "Dead Male":1497, "Dead Female":1943 }, "
{
"district":{
"Sindhupalchok":{
"Causalities":{
"Total No. of Houses":66688,
"Total Population":287798,
"Dead Male":1497,
"Dead Female":1943
},
"geoInfo":{
"Zone":"Bagmati",
"geography":"Mountain",
"Dev Region":"Central"
}
},
"Kathmandu":{
"Causalities":{
"Total No. of Houses":436344,
"Total Population":1744240,
"Dead Male":621,
"Dead Female":600
},
"geoInfo":{
"Zone":"Bagmati",
"geography":"Hill",
"Dev Region":"Central"
}
}
}
}
我尝试过使用csv.DictReader(csvfile,fieldnames),但它会在JSON中生成冗余节点,这很难解析,而且不必要地冗长
我正在使用Python2.x
这是我迄今为止的尝试:
>>> csvData = open('data.csv','rb')
>>> fieldnames = ("district", "zone", "geographicalRegion", "developmentRegion", "causalities", "injuredNumber")
>>> reader = csv.DictReader(csvData, fieldnames)
>>> rawJson = json.dumps([ row for row in reader ])
rawJson不是我一直在寻找的那个。它只是将字段名映射到各个数据集
所以问题是:如何在没有冗余节点的情况下创建这个JSON对象?正如glibdud在评论中提到的那样,您需要更手动地循环数据,以便创建所需的JSON结构 我们将CSV数据的每一行读取为
dict
,并检查是否遇到了新的地区,如果遇到了,我们将为其创建一个新的数据dict
,并将地理信息dict
插入数据中。然后我们可以从那条线和该地区的后续线收集伤亡数据。一旦我们收集了所有数据,我们就可以将数据插入主所有数据dict
为了测试代码,我将.csv数据放入一个名为'qdata.csv'的文件中
import csv
import json
filename = 'qdata.csv'
fieldnames = ('district', 'Zone', 'geography',
'Dev Region', 'casualties', 'injured')
geo_keys = ('Zone', 'geography', 'Dev Region')
all_data = {}
with open(filename, 'rb') as csvfile:
reader = csv.DictReader(csvfile, fieldnames)
# skip header
next(reader)
current_district = None
for row in reader:
district = row['district']
if district != current_district:
current_district = district
data = all_data[district] = {}
casualties = data['Casualties'] = {}
data['geoInfo'] = dict((k, row[k]) for k in geo_keys)
casualties[row['casualties']] = row['injured']
print json.dumps(all_data, indent=4, sort_keys=True)
输出
这个输出并不完全是您在问题中得到的,但我认为您应该能够从这里获得它。:) 正如glibdud在评论中提到的,您需要更手动地循环数据,以便创建所需的JSON结构
我们将CSV数据的每一行读取为dict
,并检查是否遇到了新的地区,如果遇到了,我们将为其创建一个新的数据dict
,并将地理信息dict
插入数据中。然后我们可以从那条线和该地区的后续线收集伤亡数据。一旦我们收集了所有数据,我们就可以将数据插入主所有数据dict
为了测试代码,我将.csv数据放入一个名为'qdata.csv'的文件中
import csv
import json
filename = 'qdata.csv'
fieldnames = ('district', 'Zone', 'geography',
'Dev Region', 'casualties', 'injured')
geo_keys = ('Zone', 'geography', 'Dev Region')
all_data = {}
with open(filename, 'rb') as csvfile:
reader = csv.DictReader(csvfile, fieldnames)
# skip header
next(reader)
current_district = None
for row in reader:
district = row['district']
if district != current_district:
current_district = district
data = all_data[district] = {}
casualties = data['Casualties'] = {}
data['geoInfo'] = dict((k, row[k]) for k in geo_keys)
casualties[row['casualties']] = row['injured']
print json.dumps(all_data, indent=4, sort_keys=True)
输出
这个输出并不完全是您在问题中得到的,但我认为您应该能够从这里获得它。:) 你能展示你尝试过的代码吗?@glibdud我已经添加了我尝试过的代码。由于CSV和JSON数据没有任何类型的1:1关系,你需要在CSV数据上循环,并手动构建结构。只需将其构建为dict,然后最终将其转储为JSON。您可以显示您尝试过的代码吗?@glibdud我已经添加了我尝试过的代码。由于CSV和JSON数据没有任何1:1的关系,因此您需要在CSV数据上循环并手动构建结构。只需将其构建为dict,然后最终将其转储为JSON,这与问题中的情况完全不同。但是,我发现你的JSON比我要求的更棒。非常感谢你。我可以从这里拿走它。如果我被卡住,StackOverflow就在这里;)这与问题不完全一样。但是,我发现你的JSON比我要求的更棒。非常感谢你。我可以从这里拿走它。如果我被卡住,StackOverflow就在这里;)
{
"Kathmandu": {
"Casualties": {
"Dead Female": "600",
"Dead Male": "621",
"Total No. of Houses": "436344",
"Total Population": "1744240"
},
"geoInfo": {
"Dev Region": "Central",
"Zone": "Bagmati",
"geography": "Hill"
}
},
"Sindhupalchok": {
"Casualties": {
"Dead Female": "1943",
"Dead Male": "1497",
"Total No. of Houses": "66688",
"Total Population": "287798"
},
"geoInfo": {
"Dev Region": "Central",
"Zone": "Bagmati",
"geography": "Mountain"
}
}
}