如何在Python P2P系统的JSON数组中存储不重复多元素?
避免P2P系统中JSON数组追加重复文件信息的解决方案
嘿,这个场景我在做小型P2P文件同步工具的时候刚好遇到过!核心思路就是给每个文件生成一个唯一标识,不管是在客户端提前过滤重复,还是在服务器端接收时校验,只要用这个标识判断是否已存在,就能轻松避免重复追加。
下面给你几个实用的实现方案:
方案1:服务器端接收时校验去重(最稳妥)
服务器端维护已接收的文件列表,每次收到新的JSON数据后,用文件的多维度特征做判断,而非单纯依赖文件名(毕竟同文件名不同内容/路径的情况很常见)。
推荐的文件唯一标识组合
优先选文件绝对路径 + 文件大小 + 最后修改时间,这个组合既不会像哈希值那样消耗大量计算资源,又能准确区分出内容或属性变化的文件。如果你的场景对文件内容一致性要求极高,也可以用文件内容的MD5/SHA1哈希值作为标识。
代码示例
# 服务器端维护的全局文件列表 server_file_list = [] def check_file_exist(existing_files, new_file): # 生成当前文件的唯一标识 new_file_sign = ( new_file["file_path"], new_file["file_size"], new_file["modify_time"] ) # 遍历现有列表检查是否存在 for file in existing_files: existing_sign = ( file["file_path"], file["file_size"], file["modify_time"] ) if existing_sign == new_file_sign: return True return False # 模拟接收客户端发来的JSON数据(已解析为Python字典) received_data = {"files": [{"file_path": "/test/abc.txt", "file_size": 1024, "modify_time": 1699999999}]} new_files = received_data["files"] # 处理每个文件,去重后追加 for file in new_files: if not check_file_exist(server_file_list, file): server_file_list.append(file) print(f"成功添加文件信息: {file}") else: print(f"文件信息已存在,跳过: {file['file_path']}")
方案2:用字典替代数组,提升查找效率
如果你的文件列表会非常大,数组遍历的O(n)效率会很低,这时可以用字典存储文件信息,把唯一标识作为字典的key,查找速度直接提升到O(1):
# 用字典存储,key是文件唯一标识,value是文件详情 server_files_dict = {} for file in new_files: file_sign = (file["file_path"], file["file_size"], file["modify_time"]) if file_sign not in server_files_dict: server_files_dict[file_sign] = file print(f"成功添加文件信息: {file}") else: print(f"文件信息已存在,跳过: {file['file_path']}") # 如果之后需要数组格式,直接转成列表即可 server_file_list = list(server_files_dict.values())
方案3:客户端提前过滤(减少网络传输)
如果想减轻服务器的压力,也可以在客户端发送前先过滤掉已经发送过的文件。客户端维护一个已发送文件的标识集合,每次扫描文件后先对比集合,只发送新的或变更的文件:
# 客户端维护的已发送文件标识集合 sent_file_signs = set() def get_file_sign(file_info): return (file_info["file_path"], file_info["file_size"], file_info["modify_time"]) # 扫描文件夹得到所有文件信息(假设这个函数你已经实现) all_files = scan_folder("/target/path") # 过滤出未发送的文件 files_to_send = [f for f in all_files if get_file_sign(f) not in sent_file_signs] # 发送过滤后的文件信息(这里省略JSON序列化和网络发送逻辑) send_to_server(files_to_send) # 更新已发送集合 for f in files_to_send: sent_file_signs.add(get_file_sign(f))
这样不管客户端重复发送多少次,服务器都只会收到非重复的文件信息啦!
内容的提问来源于stack exchange,提问作者hoek rand
相关产品推荐
相关产品推荐

