Python循环拉取月度API数据导出JSON仅存最后一月,如何存储全部数据?
问题原因
你当前代码的问题出在循环内的文件写入逻辑:
- 每次循环都以**写入模式
w**打开data.json,该模式会直接清空文件原有内容再写入新数据,因此前11个月的写入结果都会被后一个月的覆盖,最终仅保留最后一个月的数据。 - 另外你当前每次写入的都是单月独立的JSON结构,直接拼接也会导致最终文件不是合法的JSON格式。
推荐修改方案(生成标准合法JSON)
先在循环外初始化一个列表存储所有月份的数据,全部请求完成后统一写入文件,修改后代码如下:
import calendar from urllib.request import urlopen import json year = 2021 # 此处补充你自己的token、clientId、siteId赋值 token = "你的接口token" clientId = "你的clientId" siteId = "你的siteId" # 初始化总列表存储所有月份的用电数据 all_data = [] for month in range(1, 13): r = calendar.monthrange(year, month) start = f"{year}-{month:0>2d}-01" end = f"{year}-{month:0>2d}-{r[1]}" url = f"apilink/getKwh?token={token}&clientId={clientId}&siteId={siteId}&from={start}&to={end}" response = urlopen(url) month_data = json.loads(response.read()) # 将当月数据追加到总列表中 all_data.extend(month_data["data_json"]) # 所有月份请求完成后,统一构造最终JSON结构写入文件 final_result = {"data_json": all_data} with open("data.json", "w", encoding="utf-8") as f: json.dump(final_result, f, ensure_ascii=False, indent=2)
修改后最终的data.json为符合规范的JSON文件,结构和你单月返回的结构完全一致,仅data_json数组内会包含12个月的所有数据。
可选方案:生成JSON Lines格式(逐行追加)
如果你需要每行存储一个单月JSON的格式(适合大数据流式处理场景),可以直接使用追加模式a写入,代码修改如下:
import calendar from urllib.request import urlopen import json year = 2021 token = "你的接口token" clientId = "你的clientId" siteId = "你的siteId" for month in range(1, 13): r = calendar.monthrange(year, month) start = f"{year}-{month:0>2d}-01" end = f"{year}-{month:0>2d}-{r[1]}" url = f"apilink/getKwh?token={token}&clientId={clientId}&siteId={siteId}&from={start}&to={end}" response = urlopen(url) data = json.loads(response.read()) # 追加模式写入,每写完一个月加换行符 with open("data.json", "a", encoding="utf-8") as f: f.write(json.dumps(data, ensure_ascii=False) + "\n")
注意该格式不是标准JSON,读取时需要逐行解析加载。
内容的提问来源于stack exchange,提问作者Taariq Toffar
相关产品推荐
相关产品推荐

