如何用Python向JSON文件追加不存在的指定filename数据?
如何向JSON文件追加唯一的filename条目
看起来你已经有了基础思路,但有几个小细节可以调整,让代码更高效且能正确实现“仅当filename不存在时追加”的需求。先理清楚几个关键点:
首先,json.load(f) 并不是把JSON转成字符串,而是直接解析成Python列表(因为你的JSON根结构是数组),每个元素是包含filename键的字典,这点你可能理解错啦~
另外,原代码里的循环逻辑有个小问题:每次循环distro是列表里的单个字典,filenames = distro["filename"]拿到的是单个文件名字符串,之后用if name in filenames其实是在检查name是否是这个字符串的子串,而不是检查name是否在已有的文件名列表里,这会导致判断错误。
下面是修正后的完整代码,能实现你的需求:
import json # 假设你的待添加name列表是这个(根据你的描述,这段代码会放在循环里处理每个name) names_to_add = ["file4", "file2", "file5"] for name in names_to_add: # 1. 读取现有JSON文件 with open('gdrivefiles.json', 'r') as f: filenames_list = json.load(f) # 2. 提取所有已存在的filename到集合(集合查找比列表快很多) existing_filenames = {item["filename"] for item in filenames_list} # 3. 检查当前name是否不存在于现有列表中 if name not in existing_filenames: # 4. 添加新条目到列表 filenames_list.append({"filename": name}) # 5. 将更新后的列表写回JSON文件(注意用'w'模式覆盖,不是追加字符串!) with open('gdrivefiles.json', 'w') as f: json.dump(filenames_list, f, indent=4) # indent=4让JSON格式更美观 print(f"已追加 filename: {name}") else: print(f"filename: {name} 已存在,跳过")
关键细节解释:
- 使用集合存储已有的filename:集合的成员检查操作
in时间复杂度是O(1),比列表的O(n)高效,尤其是当你的JSON文件里条目很多的时候。 - 写回文件用
'w'模式:JSON文件是一个完整的结构化数据,不能直接用'a'模式追加字符串(那样会破坏JSON的格式,导致后续无法解析),所以每次更新都要把整个修改后的列表重新写入文件。 - 如果你的代码是单次处理一个name,而不是批量处理,只需要把
names_to_add的循环换成单个name的判断即可。
举个例子,当你处理name="file4"时,因为它不在现有列表里,就会被追加到JSON文件中,最终得到你期望的结果:
[ {"filename": "file1"}, {"filename": "file2"}, {"filename": "file3"}, {"filename": "file4"} ]
内容的提问来源于stack exchange,提问作者WoJo
相关产品推荐
相关产品推荐

