循环迭代页面时如何实现JSON文件追加而非覆盖?
问题分析与修正方案
核心错误点
- 你没有将新请求到的
data合并到已有数据中,反而每次用新的data直接覆盖了文件内容。 my_data.update(my_data)是无效操作,只是让已有数据自我更新,完全没用到当前页的新数据。- 使用
'w'模式打开文件会直接覆盖原有内容,而非合并后写入。 - 首次运行时若
data.json不存在,json.load会抛出文件未找到的异常。
修正后的代码
根据API返回的JSON结构不同,分两种常见情况处理:
情况1:API返回直接是数据列表
import requests import json # 初始化总数据:读取已有文件,不存在则为空列表 try: with open("data.json", 'r') as f: total_data = json.load(f) except FileNotFoundError: total_data = [] for i in range(4): # 用f-string拼接URL更简洁 response = requests.post(f"https://API&page={i}") page_data = response.json() # 将当前页数据追加到总数据 total_data.extend(page_data) # 一次性写入合并后的数据 with open("data.json", 'w') as f: json.dump(total_data, f, indent=2)
情况2:API返回字典,数据在指定字段下(比如results)
如果API返回的是类似{"page": 1, "results": [数据1, 数据2]}的结构,需要针对具体字段合并:
import requests import json # 初始化总数据结构 try: with open("data.json", 'r') as f: total_data = json.load(f) # 确保存储数据的字段存在 if 'results' not in total_data: total_data['results'] = [] except FileNotFoundError: total_data = {'results': []} for i in range(4): response = requests.post(f"https://API&page={i}") page_data = response.json() # 追加当前页的目标字段数据 total_data['results'].extend(page_data['results']) with open("data.json", 'w') as f: json.dump(total_data, f, indent=2)
额外说明
- 用
with语句操作文件会自动处理关闭,避免资源泄漏。 - 将文件读取放在循环外,减少重复IO操作,提升效率。
- 若API返回的JSON结构更复杂,需根据实际结构调整合并逻辑,确保是将新页面的有效数据追加到总数据中,而非覆盖整个结构。
内容的提问来源于stack exchange,提问作者retne
相关产品推荐
相关产品推荐

