正在python中创建嵌套列表。。。(真正的csv->;json转换)

正在python中创建嵌套列表。。。(真正的csv->;json转换),python,json,csv,Python,Json,Csv,我一直在努力解决这个问题,这个问题应该很简单——我只是对Python非常陌生,在本例中需要用到Python 我正在准备一个.csv文件,并尝试创建一个嵌套结构,以便json.dumps为我提供一个非常好的嵌套.json文件 结果json实际上有六层,但我想如果我能让底部的两层正常工作,其余的也一样。输入非常有效,因为我最终完成了构建结构的作业['fieldname']。问题是如何得到嵌套的结果 最终我想要: "PAYLOAD": { "TEST": [ { "JOB_ONE"

我一直在努力解决这个问题,这个问题应该很简单——我只是对Python非常陌生,在本例中需要用到Python

我正在准备一个.csv文件,并尝试创建一个嵌套结构,以便json.dumps为我提供一个非常好的嵌套.json文件

结果json实际上有六层,但我想如果我能让底部的两层正常工作,其余的也一样。输入非常有效,因为我最终完成了构建结构的作业['fieldname']。问题是如何得到嵌套的结果

最终我想要:

"PAYLOAD": {
  "TEST": [
   {
     "JOB_ONE": {
       "details": {
         "customerInformation": {
           "lastName": "Chun",
           "projectName": "N Pacific Recovery",
           "firstName": "Wally",
           "secondaryPhoneNumber": ""
            },
         "description": "N Pacific Garbage Sweep",
         "productType": "Service Generation",
         "address": {
           "city": "Bristol",
           "zipCodePlusSix": "",
           "stateName": "",
           "zipCode": "53104",
           "line1": "12709 789441th Ave",
           "county": "",
           "stateCode": "WI",
           "usage": "NA",
           "zipCodePlusFour": "",
           "territory": "",
          }
       }
     }
   },
 {
   "JOB_TWO": {
     "details": {

   .... similar to JOB_ONE ....

       }
     }
   }
   }],
   "environment": "N. Pacific",
   "requestorName": "Waldo P Rossem",
   "requestorEmail": "waldo@ no where.com",
然而,下面的代码只处理“细节部分”,我最终得到了一个包含所有地址的堆栈,后面是所有客户信息。因此,循环处理所有csv记录并附加地址,然后循环csv记录并附加信息

for job in csv.DictReader(csv_file):
  if not job['Cancelled']: 

# actually have no idea how to get these two to work    
    details['description']: job['DESCRIBE']     
    details['projectType']: job['ProjectType']


# the following cycle through the customerInformation and then
# appends the addresses.  So I end up with a large block of customer 
# records and then a second block of their addresses

    details['customerInformation'].append({
            'lastName': "job[Lastname]",
            'firstName': job['FirstName'],
            'projectName':"N Pacific Prototype",
        })

   details['address'].append({
            'city': job['City'],
            'zipCode': job['Zip'],
            'line1': job['Address'],
            'stateCode': job['State'],
            'market': job['Market']
        })
我试图理解的是如何修复这个循环,使描述和项目类型显示在正确的位置,并设置数据结构,以便底部标志也能正确地用于最终json转储

这主要是因为我缺乏Python经验,但不幸的是,这是一个要求——否则,我可以在数小时前用gawk完成

请求的CSV如下:


当然。。。我花了一些时间把它虚构出来,因为上面是一个简短的片段

JobNumber,FirstName,Lastname,secondaryPhoneNumber,Market,Address,City,State,Zip,requestorName,requestorEmail,environment
22056,Wally,Fruitvale,,N. Pacific,81 Stone Church Rd,Little Compton,RI,17007,Waldo P Rossem,waldo@ no where.com,N. Pacific
22057,William,Stevens,,Southwest,355 Vt Route 8a,Jacksonville,VT,18928,Waldo P Rossem,waldo@ no where.com,N. Pacific
22058,Wallace,Chen,,Northeast,1385 Jepson Rd,Stamford,VT,19403,Waldo P Rossem,waldo@ no where.com,N. 
你不远了。 您首先需要将
详细信息
初始化为
命令

details = {}
然后添加所需的元素:

details['description'] = job['DESCRIBE']     
details['projectType'] = job['ProjectType']
然后对于嵌套的:

details['customerInformation'] = {
        'lastName': job['Lastname'],
        'firstName': job['FirstName'],
        'projectName':"N Pacific Prototype",
    }
有关如何使用dict的更多详细信息,请参见:

然后您可以使用
JSON.dumps(详细信息)
(此处的文档:)获取
JSON

或者,您可以先收集列表中的所有详细信息,然后将列表转换为
JSON
字符串:

all_details = []
for job in ...:
    (build details dict)
    all_details.append(details)

output = JSON.dumps(all_details)
你不远了。 您首先需要将
详细信息
初始化为
命令

details = {}
然后添加所需的元素:

details['description'] = job['DESCRIBE']     
details['projectType'] = job['ProjectType']
然后对于嵌套的:

details['customerInformation'] = {
        'lastName': job['Lastname'],
        'firstName': job['FirstName'],
        'projectName':"N Pacific Prototype",
    }
有关如何使用dict的更多详细信息,请参见:

然后您可以使用
JSON.dumps(详细信息)
(此处的文档:)获取
JSON

或者,您可以先收集列表中的所有详细信息,然后将列表转换为
JSON
字符串:

all_details = []
for job in ...:
    (build details dict)
    all_details.append(details)

output = JSON.dumps(all_details)

您可以将
详细信息
dict创建为文字,而不是创建和
赋值:

data = []
for job in csv.DictReader(csv_file):
    if job['Cancelled']:
        continue
    details = {
        'description': job['DESCRIBE'],
        'projectType': job['ProjectType'],
        'customerInformation' : {
            'lastName': job['Lastname'],
            'firstName': job['FirstName'],
            ...
        },
        ...
    }
    data.append(details)
json_str = json.dumps(data)
my_dict = {
   "key1": "value1",
   "key2": "value2",
   ...
}

您可以将
详细信息
dict创建为文字,而不是创建和
赋值:

data = []
for job in csv.DictReader(csv_file):
    if job['Cancelled']:
        continue
    details = {
        'description': job['DESCRIBE'],
        'projectType': job['ProjectType'],
        'customerInformation' : {
            'lastName': job['Lastname'],
            'firstName': job['FirstName'],
            ...
        },
        ...
    }
    data.append(details)
json_str = json.dumps(data)
my_dict = {
   "key1": "value1",
   "key2": "value2",
   ...
}

我认为你所需要的只是了解一些关于字典的基本知识:

首次派遣:

data = []
for job in csv.DictReader(csv_file):
    if job['Cancelled']:
        continue
    details = {
        'description': job['DESCRIBE'],
        'projectType': job['ProjectType'],
        'customerInformation' : {
            'lastName': job['Lastname'],
            'firstName': job['FirstName'],
            ...
        },
        ...
    }
    data.append(details)
json_str = json.dumps(data)
my_dict = {
   "key1": "value1",
   "key2": "value2",
   ...
}
将键/值对写入已初始化的dict:

my_dict["key2"] = "new value"
阅读:

my_dict["key2"]
prints> "new value"
循环键:

for key in my_dict:
   print(key)

prints> "key1"
prints> "key2"
循环键和值:

for key, value in my_dict.items():
   ...
仅循环值:

for value in my_dict.values():
   ...
如果你想要的只是一个JSON兼容的dict,那么你就不需要更多的东西了,不用我讨论DefaultDict、元组键等等——只要知道,一旦你了解了基本的dict、list、tuple和set,就值得一读了


编辑:还有一件事:即使是新的,我认为用Python探索您的想法也是值得的。我发现尝试并立即返回结果要快得多,因为您不必在编辑器和控制台之间切换。

我认为您所需要的是了解有关词典的一些基本知识:

首次派遣:

data = []
for job in csv.DictReader(csv_file):
    if job['Cancelled']:
        continue
    details = {
        'description': job['DESCRIBE'],
        'projectType': job['ProjectType'],
        'customerInformation' : {
            'lastName': job['Lastname'],
            'firstName': job['FirstName'],
            ...
        },
        ...
    }
    data.append(details)
json_str = json.dumps(data)
my_dict = {
   "key1": "value1",
   "key2": "value2",
   ...
}
将键/值对写入已初始化的dict:

my_dict["key2"] = "new value"
阅读:

my_dict["key2"]
prints> "new value"
循环键:

for key in my_dict:
   print(key)

prints> "key1"
prints> "key2"
循环键和值:

for key, value in my_dict.items():
   ...
仅循环值:

for value in my_dict.values():
   ...
如果你想要的只是一个JSON兼容的dict,那么你就不需要更多的东西了,不用我讨论DefaultDict、元组键等等——只要知道,一旦你了解了基本的dict、list、tuple和set,就值得一读了


编辑:还有一件事:即使是新的,我认为用Python探索您的想法也是值得的。我发现尝试并立即返回结果要快得多,因为您不必在编辑器和控制台之间切换。

能否请您共享CSVSure的格式。。。我花了一些时间把它捏造出来,因为上面是一个简短的片段。这里的答案对你有帮助吗!?是的,我正在完成这个过程。我还将注意到,我使用的是jupyter笔记本电脑,因此我可以立即获得反馈。您能否分享CSVSure的格式。。。我花了一些时间把它捏造出来,因为上面是一个简短的片段。这里的答案对你有帮助吗!?是的,我正在完成这个过程。我还要注意的是,我使用的是jupyter笔记本电脑,因此我可以得到即时反馈。
详细信息应该在每个循环中创建新的,所以不会在循环之外创建。回答很好,而且很有效。我最后使用了AChampion的评论,因为它看起来更直接。然而,我也很欣赏使用dict的提示。在几分钟内,我已经从垃圾变成了真正的结束,谢谢你。
细节应该在每个循环中创建新的,所以不会在循环之外创建它。回答得很好,而且很有效。我最后使用了AChampion的评论,因为它看起来更直接。然而,我也很欣赏使用dict的提示。几分钟之内,我就从垃圾桶变成了真正的垃圾桶,谢谢你们。