如何修正代码以从JSON文件中删除Proc为APS的指定条目?
如何修正Python代码删除JSON中指定条目?
你的代码没生效主要有两个原因:一是遍历列表时直接删除循环变量item并不会修改原列表,二是r+模式下直接写入会导致内容追加而非覆盖。下面给你两种可行的修正方案:
方案一:列表推导式过滤(推荐)
这种方式最简洁易读,先读取JSON内容,过滤掉不需要的条目后再覆盖写入文件:
import json # 读取原JSON文件内容 with open('E:/file/timings.json', 'r', encoding='utf-8') as f: qe = json.load(f) # 过滤掉Proc为"APS"的条目,生成新的times列表 qe['times'] = [item for item in qe['times'] if item['Proc'] != 'APS'] # 将处理后的内容写入文件,覆盖原内容 with open('E:/file/timings.json', 'w', encoding='utf-8') as f: json.dump(qe, f, indent=4, sort_keys=False, ensure_ascii=False)
为什么这个方案有效?
- 列表推导式直接生成了不包含
Proc="APS"的新列表,替换掉原有的qe['times'],从根源上修改了数据结构。 - 分开使用
r和w模式:r只读读取内容,w模式会清空原文件再写入新内容,避免了文件指针位置导致的追加问题。
方案二:反向遍历删除元素(适合需要保留原列表修改逻辑的场景)
如果你一定要通过遍历删除元素,需要反向遍历列表(避免正向删除时索引错位),同时调整文件操作的方式:
import json with open('E:/file/timings.json', 'r+', encoding='utf-8') as f: qe = json.load(f) # 从后往前遍历列表索引,防止删除元素后后续元素前移导致漏处理 for i in range(len(qe['times'])-1, -1, -1): item = qe['times'][i] if item['Proc'] == 'APS': print(f'{item["Num"]}') del qe['times'][i] # 将文件指针移到文件开头,截断原有内容,再写入新数据 f.seek(0) f.truncate() json.dump(qe, f, indent=4, sort_keys=False, ensure_ascii=False)
原代码的问题拆解
del item无效:item只是循环中的临时变量,删除它不会影响原列表qe['times']中的元素,原列表根本没被修改。r+模式写入问题:读取完文件后,文件指针停在文件末尾,直接json.dump会把新内容追加到原文件后面,而不是覆盖,导致原内容还留在文件里。
内容的提问来源于stack exchange,提问作者EcSync
相关产品推荐
相关产品推荐

