Я пытаюсь преобразовать CSV-файл в JSON-файл для отправки в API. У меня возникли проблемы со структурой вывода JSON, который я создал.

import csv
import json

csvfile = open('User_List.csv', 'r')
jsonfile = open('user_list.json', 'w')    

csv_reader = csv.DictReader(csvfile)
for row in reader:
    json.dump(row, jsonfile, indent = 4)
    jsonfile.write('\n')

Мой код в настоящее время выводит:

{
    "firstName": "Richard",
    "lastName": "Tyler",
    "email": "hallbeth@placeholder.email",
    "zip": "58570"
}

И мне нужно это прочитать:

{
    "email": "hallbeth@placeholder.email",
    "Datafields": {"firstName": "Richard",
                   "lastName": "Tyler",
                   "zip": "58570"}
}
1
Tgt5023 3 Июл 2019 в 22:14

3 ответа

Лучший ответ

Вам необходимо реорганизовать данные из каждой строки, чтобы они были в нужном вам формате, прежде чем выводить их в формате JSON:

import csv
import json

with open('User_List.csv', 'r', newline='') as csvfile, \
     open('user_list.json', 'w') as jsonfile:

    for row in csv.DictReader(csvfile):
        # Reorganize data into desired format.
        restructured = {
            'email': row['email'],
            'Datafields':
              {fieldname: value for (fieldname, value) in row.items()
                  if fieldname != 'email'}
        }
        json.dump(restructured, jsonfile, indent=4)
        jsonfile.write('\n')
0
martineau 3 Июл 2019 в 20:07

Давайте назовем это temp_dict

temp_dict = {
    "firstName": "Richard",
    "lastName": "Tyler",
    "email": "hallbeth@placeholder.email",
    "zip": "58570"
}

new_dict = {
    "email" : temp_dict["email"],
    "Datafields" : { 
        "firstName": temp_dict["firstName"],
        "lastName": temp_dict["lastName"],    
        "zip": temp_dict["zip"]        
        }

Вы можете просто создать новый словарь и назначить значения его ключу таким образом

0
Vaibhav Sharma 3 Июл 2019 в 19:17

Вы можете сделать диктат из своего оригинала data и использовать понимание для "DataFields":

{'email': data['email'], 'Datafields' : {k:v for k,v in data.items() if k!='email'}}

Смотрите ниже, например,

data =  data = {
    "firstName": "Richard",
    "lastName": "Tyler",
    "email": "hallbeth@placeholder.email",
    "zip": "58570"
}
organized = {
    'email': data.get('email'),
    'Datafields' : {k:v for k,v in data.items() if k!='email'}
}
print(organized)
{'email': 'hallbeth@placeholder.email', 'Datafields': {'firstName': 'Richard', 'lastName': 'Tyler', 'zip': '58570'}}
0
Jab 3 Июл 2019 в 19:32