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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:05:37