如何用datetime动态命名Python嵌套对象处理JSON数据
解决方案
要实现JSON中月份部分的动态命名,核心是用datetime生成对应格式的月份字符串(如June24),替换代码中硬编码的June24字段。以下是修改后的完整代码及关键优化点:
修改后的代码
import json from datetime import date import requests # 动态生成当前月份键名(格式:June24)和当日日期键 current_month_key = date.today().strftime("%B%y") today_key = date.today().strftime("%Y%m%d") filename = f"{current_month_key}.json" # 初始化基础数据结构 device = { "Log_Cabin": { "month": {} } } # 从Shelly设备获取能源数据 url = 'http://192.168.0.241/cm?cmnd=Status%208' resp = requests.get(url=url) device_data = resp.json() # 提取所需数据 current_energy = device_data['StatusSNS']['ENERGY']['Power'] print(current_energy) # 读取现有JSON文件(若存在则合并数据) try: with open(filename, 'r') as f: existing_data = json.load(f) # 合并现有月份数据到当前结构,避免覆盖历史记录 device["Log_Cabin"]["month"].update(existing_data.get("Log_Cabin", {}).get("month", {})) except (FileNotFoundError, json.JSONDecodeError): print("未找到有效历史文件,将创建新文件") # 确保当前月份的字典存在,不存在则初始化 if current_month_key not in device["Log_Cabin"]["month"]: device["Log_Cabin"]["month"][current_month_key] = {} # 初始化月度总计字段 device["Log_Cabin"]["month"]["Monthly Total"] = {} # 更新当日能源数据 device["Log_Cabin"]["month"][current_month_key][today_key] = current_energy # 写入格式化后的JSON文件 with open(filename, 'w') as f: json.dump(device, f, indent=4) print(current_energy)
关键修改说明
- 动态月份键:通过
date.today().strftime("%B%y")自动生成与文件名匹配的月份键,彻底替代硬编码的June24,实现月份的动态命名。 - 数据合并:读取现有文件后使用
update方法合并历史数据,确保不会丢失之前记录的日期或月份信息。 - 安全初始化:通过判断月份键是否存在,避免重复创建或覆盖已有月份的记录,保证数据的一致性。
- 格式化输出:添加
indent=4参数让生成的JSON文件结构更清晰,便于后续查看和维护。
内容的提问来源于stack exchange,提问作者john Wallace
相关产品推荐
相关产品推荐

