You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python体重追踪器:JSON嵌套字典日期键的赋值错误解决

问题分析与解决方案

你的核心问题是日期存在性判断的层级错误,还错误地把data['Dates']从字典改成了字符串,导致后续无法通过日期索引修改体重。下面一步步给你修正:

错误点拆解

  1. 你用if today not in data:判断日期是否存在,但data的顶层只有"Dates"这个键,日期是存在于data['Dates']这个子字典里的,这个判断完全不对。
  2. 执行data['Dates'] = today时,直接把data['Dates']从字典改成了字符串today,后续再用data['Dates'][today]自然会报错——字符串不支持用字符串做索引。

修正后的完整代码

import json

# 打开并读取JSON文件,处理文件不存在的情况
try:
    with open('main.json', 'r') as f:
        data = json.load(f)
        # 确保Dates键存在且是字典(处理初始空文件或结构不完整的情况)
        if 'Dates' not in data or not isinstance(data['Dates'], dict):
            data['Dates'] = {}
except FileNotFoundError:
    # 如果文件不存在,初始化默认结构
    data = {'Dates': {}}

today = input("Enter the date(MM/DD/YY): ")
# 检查日期是否在Dates字典里,不存在就创建对应的子字典
if today not in data['Dates']:
    data['Dates'][today] = {'Morning': None, 'Night': None}

answer = input("Morning or Night? (Case sensitive): ")
# 处理体重输入,转成数字类型
if answer == "Morning":
    try:
        m_weight = float(input("Weight? "))
        data['Dates'][today]['Morning'] = m_weight
    except ValueError:
        print("请输入有效的数字体重!")
elif answer == "Night":
    try:
        n_weight = float(input("Weight? "))
        data['Dates'][today]['Night'] = n_weight
    except ValueError:
        print("请输入有效的数字体重!")
else:
    print("Please enter Morning or Night.")

# 把修改后的数据写回JSON文件
with open('main.json', 'w') as f:
    json.dump(data, f, indent=4)

关键修正说明

  1. 文件读取健壮性:
    • 用try-except处理文件不存在的情况,自动初始化默认的{'Dates': {}}结构。
    • 确保data['Dates']始终是字典,避免因为JSON文件结构损坏导致报错。
  2. 日期存在性判断:
    • 正确判断today not in data['Dates'],不存在时给data['Dates'][today]创建包含Morning和Night的子字典,而不是修改data['Dates']本身。
  3. 体重数据类型处理:
    • 把用户输入的字符串转成float(也可以用int,看你需求),确保JSON里存的是数字而不是字符串,符合你的示例结构。
  4. 写回文件:
    • 新增了把修改后的数据写回JSON的代码,不然你的修改只会停留在内存里,关闭程序后就丢失了。

测试流程示例

假设main.json初始内容是你给的示例:

{
    "Dates": {
        "11/11/11": {
            "Morning": 500,
            "Night": 502
        }
    }
}
  • 输入日期11/11/11,选择Morning,输入501,修改后该日期的Morning体重会变成501。
  • 输入日期12/12/12,选择Night,输入505,JSON会新增这个日期的条目,Night体重为505。

内容的提问来源于stack exchange,提问作者Steamly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:15:29