如何更改用户输入的字符串的值,这些字符串在从JSON提取的嵌套字典中充当键

hrirmatl  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(79)

我为这个疯狂的标题感到抱歉。我是编程新手,不知道我在做什么。
我正在做一个体重跟踪器,它将数据保存到JSON中。数据是一个嵌套的字典,应该看起来像:

{
    "Dates": {
        "11/11/11": {
            "Morning": 500,
            "Night": 502
            
        }
    }
}

我一直在尝试让跟踪器要求输入日期,并使用该输入作为“日期”键的新值,只要日期不存在,如果它确实存在,然后根据用户输入将新值附加到早晨或夜晚键。
下面是我的代码:

weight_date_dict = open('main.json')

today = input("Enter the date(MM/DD/YY): ")

data = json.loads(weight_date_dict.read())

if today not in data:
    data['Dates'] = today

answer = input("Morning or Night? (Case sensitive): ")
if answer == "Morning":
    m_weight = input("Weight? ")
    #ERROR: Cant index a string('Dates') with a string(today)
    data['Dates'][today]['Morning'] = m_weight
elif answer == "Night":
    n_weight = input("Weight? ")
    data['Dates'][today]['Night'] = n_weight
else:
    print("Please enter Morning or Night.")

在解决了如何写入json而不覆盖其中以前的字典键/值之后,我添加了:

if today not in data:
    data['Dates'] = today
    data['Dates'][today] = {'Morning': None, 'Night': None}

添加一个新的日期,结果是“TypeError:'str对象不支持项分配'“
data['Dates'][today]['Morning'] = m_weight行应该向Morning或Night键追加一个新值,但它不起作用,因为字符串不能被字符串索引。
我不知道如何将值附加到一个自用户输入以来已经存在的日期。我觉得我完全不知道该怎么做。

9lowa7mx

9lowa7mx1#

你的代码有几个问题:
首先

if today not in data:
    data['Dates'] = today

不是你想的那样。today not in data检查today是否存在于data中,但所有实际数据都在data['Dates']中。此外,通过执行data['Dates'] = today,您将覆盖所有这些数据。你真正想做的是:

today = input("Enter the date(MM/DD/YY): ")
if today not in data['Dates']:
    data['Dates'][today] = {}

这就是为什么稍后尝试执行data['Dates'][today]时会出现错误的原因。data['Dates']不再是你的数据字典,它是今天的日期字符串。
您的代码还存在一些其他问题,例如不能将用户输入从字符串转换为整数。我还做了一些修改,以减少代码,使其更干净。以下是我为你工作的完整代码:

import json

data = None
with open('main.json') as f:
    data = json.loads(f.read())

today = input("Enter the date(MM/DD/YY): ")
if today not in data['Dates']:
    data['Dates'][today] = {}

answer = input("Morning or Night? (Case sensitive): ")
weight = int(input("Weight? "))
data['Dates'][today]['Morning'] = weight

with open('main.json', 'w') as f:
    json.dump(data, f)
biswetbf

biswetbf2#

您应该检查由"Dates"键标识的子对象中的日期,如果它还不存在,则将其设置为空对象。

if today not in data['Dates']:
    data['Dates'][today] = {}

此外,您需要将用户输入从str转换为int。

m_weight = int(input("Weight? "))
# ...
n_weight = int(input("Weight? "))

最后,使用json.dump将更新后的版本写入程序结束时的文件。

with open('main.json', 'w') as f:
    json.dump(data, f, indent=4)

相关问题