如何调整嵌套的.JSON树(Python字典)的Python代码以包含多个键?

如何调整嵌套的.JSON树(Python字典)的Python代码以包含多个键?,python,json,dictionary,Python,Json,Dictionary,在我当前的代码中,当主题键应该有更多值时,它似乎只考虑一个值(您只能在我的JSON树中看到经济学,而不能看到数学)。我已经试了好几个小时了,但还是没法用 这是我的样本数据集-我的完整数据集中还有很多主题: ID,Name,Date,Subject,Start,Finish 0,Ladybridge High School,01/11/2019,Maths,05:28,06:45 0,Ladybridge High School,02/11/2019,Maths,05:30,06:45 0,Lad

在我当前的代码中,当主题键应该有更多值时,它似乎只考虑一个值(您只能在我的JSON树中看到经济学,而不能看到数学)。我已经试了好几个小时了,但还是没法用

这是我的样本数据集-我的完整数据集中还有很多主题:

ID,Name,Date,Subject,Start,Finish
0,Ladybridge High School,01/11/2019,Maths,05:28,06:45
0,Ladybridge High School,02/11/2019,Maths,05:30,06:45
0,Ladybridge High School,01/11/2019,Economics,11:58,12:40
0,Ladybridge High School,02/11/2019,Economics,11:58,12:40
1,Loreto Sixth Form,01/11/2019,Maths,05:28,06:45
1,Loreto Sixth Form,02/11/2019,Maths,05:30,06:45
1,Loreto Sixth Form,01/11/2019,Economics,11:58,12:40
1,Loreto Sixth Form,02/11/2019,Economics,11:58,12:40
以下是我的Python代码:

timetable = {"Timetable": []}
with open("C:/Users/kspv914/Downloads/Personal/Project Dawn/Timetable Sample.csv") as f:
    csv_data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)]

    name_array = []
    for name in [row["Name"] for row in csv_data]:
        name_array.append(name)
    name_set = set(name_array)

    for name in name_set:
        timetable["Timetable"].append({"Name": name, "Date": {}})

    for row in csv_data:
        for entry in timetable["Timetable"]:
            if entry["Name"] == row["Name"]:
                entry["Date"][row["Date"]] = {}
                entry["Date"][row["Date"]][row["Subject"]] = {
                    "Start": row["Start"],
                    "Finish": row["Finish"]
                }
这是我的JSON树:

您正在将date dict设置为空,然后添加一个主题

这样做:

timetable = {"Timetable": []}
with open("a.csv") as f:
    csv_data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)]

    name_array = []
    for name in [row["Name"] for row in csv_data]:
        name_array.append(name)
    name_set = set(name_array)

    for name in name_set:
        timetable["Timetable"].append({"Name": name, "Date": {}})

    for row in csv_data:
        for entry in timetable["Timetable"]:
            if entry["Name"] == row["Name"]:
                if row["Date"] not in entry["Date"]:
                    entry["Date"][row["Date"]] = {}
                entry["Date"][row["Date"]][row["Subject"]] = {
                    "Start": row["Start"],
                    "Finish": row["Finish"]
                }
在将
{}
赋值给
条目[“日期”][行[“日期”]]之前,我刚刚添加了if条件

它将给出如下图所示的输出:

您正在将date dict设置为空,然后添加一个主题

这样做:

timetable = {"Timetable": []}
with open("a.csv") as f:
    csv_data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)]

    name_array = []
    for name in [row["Name"] for row in csv_data]:
        name_array.append(name)
    name_set = set(name_array)

    for name in name_set:
        timetable["Timetable"].append({"Name": name, "Date": {}})

    for row in csv_data:
        for entry in timetable["Timetable"]:
            if entry["Name"] == row["Name"]:
                if row["Date"] not in entry["Date"]:
                    entry["Date"][row["Date"]] = {}
                entry["Date"][row["Date"]][row["Subject"]] = {
                    "Start": row["Start"],
                    "Finish": row["Finish"]
                }
在将
{}
赋值给
条目[“日期”][行[“日期”]]之前,我刚刚添加了if条件

它将给出如下图所示的输出:
您正在使用
条目[“日期”][行[“日期”]][行[“主题”]]=
覆盖您的dict条目。第一次满足“数学”时,将创建条目。第二次它被覆盖

您的预期结果应该是
列表
,而不是
目录
。每个条目都应该用
时间表\u list.append()
附加到列表中

下面是一段简单的代码,它可以在不丢失数据的情况下将整个csv文件转换为Json:

import csv
import json

data = []

with open("ex1.csv") as f:
    reader = csv.DictReader(f)
    for row in reader:
        data.append(row)

print(json.dumps({"Timetable": data}, indent=4))

您正在使用
条目[“日期”][行[“日期”]][行[“主题”]]=
覆盖dict条目。第一次满足“数学”时,将创建条目。第二次它被覆盖

您的预期结果应该是
列表
,而不是
目录
。每个条目都应该用
时间表\u list.append()
附加到列表中

下面是一段简单的代码,它可以在不丢失数据的情况下将整个csv文件转换为Json:

import csv
import json

data = []

with open("ex1.csv") as f:
    reader = csv.DictReader(f)
    for row in reader:
        data.append(row)

print(json.dumps({"Timetable": data}, indent=4))

你能详细说明你的具体问题吗?在我的JSON树中,你只能看到经济学主题…数学到哪里去了?你能详细说明你的具体问题吗?在我的JSON树中,你只能看到经济学主题…数学到哪里去了?非常感谢。知道我将如何添加与“名称”(无嵌套数据)和“日期”(包含嵌套数据)处于同一级别的其他数据(无嵌套数据)吗?非常感谢。知道如何添加与“名称”(无嵌套数据)和“日期”(包含嵌套数据)处于同一级别的其他数据(无嵌套数据)吗?