如何用Python检查JSON文件记录并避免重复写入?
解决JSON记录去重问题
我来帮你搞定这个去重的问题!你的现有代码核心问题在于直接追加JSON片段到文件,既没有读取已有的记录做检查,还会导致文件里出现多个独立的JSON结构(这其实是不合法的JSON格式),自然没法实现去重。下面给你一步步拆解解决方案:
核心思路
要实现去重,必须遵循「读→查→改→写」的流程:
- 先读取已有的JSON文件内容(如果文件不存在,就初始化一个空的结构)
- 遍历要添加的记录,检查每个
id是否已经存在于现有记录中 - 只添加那些不存在的记录
- 把更新后的完整数据写回文件(注意是覆盖写入,不是追加)
修改后的完整代码
import json import io # 定义要处理的文件路径 file_path = 'data.json' # 1. 读取现有数据,处理文件不存在的情况 try: with io.open(file_path, 'r', encoding='utf-8') as fp: try: existing_data = json.load(fp) # 确保insta列表存在,避免旧数据格式不一致 if 'insta' not in existing_data: existing_data['insta'] = [] except json.JSONDecodeError: # 如果文件是空的或者格式错误,初始化默认结构 existing_data = {'insta': []} except FileNotFoundError: # 文件不存在时初始化 existing_data = {'insta': []} # 2. 遍历要添加的记录,去重后添加 for f in unique_following: # 检查当前id是否已经存在于insta列表中 is_exist = any(item['id'] == f for item in existing_data['insta']) if not is_exist: existing_data['insta'].append({'id': f, 'dm': False}) print(f"添加新记录:{f}") else: print(f"记录已存在,跳过:{f}") # 3. 把更新后的数据写回文件(覆盖写入,保证JSON格式合法) with io.open(file_path, 'w', encoding='utf-8') as fp: json.dump(existing_data, fp, indent=1, ensure_ascii=False)
关键细节解释
- 避免追加模式:原来的
'a'模式会把新的JSON片段直接加到文件末尾,导致整个文件不是合法的JSON(比如会出现{"insta": [...]} {"insta": [...]}这种结构),'w'模式覆盖写入能保证文件始终是一个完整的JSON对象。 - 存在性检查:用
any()配合生成器表达式,高效检查列表中是否已有相同id的记录,比遍历整个列表更简洁。 - 异常处理:考虑了文件不存在、文件为空、JSON格式错误等边界情况,避免程序崩溃。
这样改完之后,就能确保每个id只会被添加一次,不会出现重复记录啦!
内容的提问来源于stack exchange,提问作者aron9711
相关产品推荐
相关产品推荐

