JSON教师数据合并重复条目漏判、dump后文件末尾追加乱码问题求解
问题根因分析
重复条目未识别问题
- 遍历
teachers数组的同时执行pop操作,会导致当前位置之后的所有元素索引整体前移,你提前存在i_duplicates中的旧索引会指向错误的条目,匹配自然失效 - 遍历用的计数器
i不会因为数组长度变化自动回退,你pop了索引为i的元素后,原i+1位置的元素会移动到i位置,下一轮循环i直接加1,就会跳过这个元素,导致部分重复条目没有被检测 - 用字典对象做
in判断的方式冗余且存在不稳定因素,直接用姓名字符串做匹配键会更可靠
文件末尾残留多余内容问题
- 你使用
r+模式打开文件,该模式下写入的新内容如果比原文件内容短,原文件末尾没有被新内容覆盖的旧数据会直接残留,就是你看到的多余字符串 - 每次修改数组就执行一次
json.dump属于没必要的频繁IO,既低效也容易触发文件读写异常
修复后代码
import json from colorama import Fore def converter(): # 先读取整个文件内容到内存 with open("final2.json", "r", encoding="utf-8") as f: infinite = json.load(f) # 用字典做姓名到教师条目的映射,O(1)复杂度匹配,不会有索引问题 name_map = {} processed_teachers = [] for teacher in infinite["teachers"]: full_name = teacher["fullName"] # 如果输入中单个教师条目class数组可能有多个元素,改成遍历teacher["class"]逐个追加即可 class_data = teacher["class"][0] if full_name in name_map: # 已存在同名条目,直接追加class name_map[full_name]["class"].append(class_data) else: # 不存在就新建记录,加入处理后的列表 name_map[full_name] = teacher processed_teachers.append(teacher) # 替换原数组 infinite["teachers"] = processed_teachers # 一次性写入文件,用w模式直接覆盖原内容,不会有残留 with open("final2.json", "w", encoding="utf-8") as f: json.dump(infinite, f, indent=4, ensure_ascii=False)
内容的提问来源于stack exchange,提问作者infecting
相关产品推荐
相关产品推荐

