You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:24:03