在Python中将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 }, "

我有一个包含以下内容的CSV文件:

资料来源:

我的目标是从中生成一个JSON对象,如下所示:

{
  "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"
        }
    }
}