Python体重追踪器:JSON嵌套字典日期键的赋值错误解决
问题分析与解决方案
你的核心问题是日期存在性判断的层级错误,还错误地把data['Dates']从字典改成了字符串,导致后续无法通过日期索引修改体重。下面一步步给你修正:
错误点拆解
- 你用
if today not in data:判断日期是否存在,但data的顶层只有"Dates"这个键,日期是存在于data['Dates']这个子字典里的,这个判断完全不对。 - 执行
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)
关键修正说明
- 文件读取健壮性:
- 用
try-except处理文件不存在的情况,自动初始化默认的{'Dates': {}}结构。 - 确保
data['Dates']始终是字典,避免因为JSON文件结构损坏导致报错。
- 用
- 日期存在性判断:
- 正确判断
today not in data['Dates'],不存在时给data['Dates'][today]创建包含Morning和Night的子字典,而不是修改data['Dates']本身。
- 正确判断
- 体重数据类型处理:
- 把用户输入的字符串转成
float(也可以用int,看你需求),确保JSON里存的是数字而不是字符串,符合你的示例结构。
- 把用户输入的字符串转成
- 写回文件:
- 新增了把修改后的数据写回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
相关产品推荐
相关产品推荐

