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

如何用Python检测相似文件名并筛选最新版本?

批量清理重复版本文件的Python方案

问题背景

我有一个结构杂乱的文件夹,其中包含大量文件,且长期以来保存了很多文件版本,例如:

Our awesome presentation v0.pptx
our_awesome_presentation v1.pptx
Our_Awesome_Presentation_vF.pptx

我希望用Python从中挑选一个文件并丢弃其余文件,文件夹中可能有数万个此类文件,对应数千个唯一文档。我不需要100%准确地挑选文件,因此认为通过文件创建日期或最后修改日期来筛选即可。即便遗漏部分相似文件(即误将同一文件的两个版本当作不同文件)也无妨,简言之,我无需做到完美,仅希望在保留尽可能多唯一信息的同时精简文件夹体积。

我目前考虑需要某种文件名字符串相似度评分方法,请问有什么合适的实现方式?能否使用nltk?该如何操作?

可行方案

一、常用字符串相似度实现方式

1. Levenshtein编辑距离

这是最常用的字符串相似度计算方法,通过统计两个字符串之间的插入、删除、替换操作次数来衡量相似度,结果越接近1,相似度越高。可以直接用第三方库python-Levenshtein实现:

from Levenshtein import ratio

# 示例:计算两个文件名的相似度
score = ratio("Our awesome presentation", "our_awesome_presentation")
print(score)  # 输出接近1的数值

2. Jaccard相似度

将字符串拆分为n-gram(比如二元字符组),通过计算两个字符串n-gram集合的交集与并集的比例得到相似度,适合处理带空格或分隔符的文件名:

def jaccard_similarity(s1, s2, n=2):
    # 生成n-gram集合
    s1_ngrams = set([s1[i:i+n] for i in range(len(s1)-n+1)])
    s2_ngrams = set([s2[i:i+n] for i in range(len(s2)-n+1)])
    # 计算交集与并集的比例
    return len(s1_ngrams & s2_ngrams) / len(s1_ngrams | s2_ngrams)

# 示例调用
score = jaccard_similarity("Our awesome presentation", "our_awesome_presentation")

二、用NLTK实现相似度计算

NLTK可以实现字符串相似度,但针对文件名这类短文本属于“大材小用”,不过也能快速实现。核心思路是先清理文件名(统一格式、去除版本标记),再用编辑距离计算:

from nltk.metrics.distance import edit_distance
import re

# 清理文件名:转小写、替换下划线为空格、去除版本号
def clean_filename(filename):
    # 分离文件名和后缀,只处理文件名部分
    name_part = filename.rsplit('.', 1)[0].lower().replace('_', ' ')
    # 移除v开头的版本标记(如v0、v1、vF)
    name_part = re.sub(r'\bv\d+|\bvf\b', '', name_part).strip()
    return name_part

# 示例清理
s1_clean = clean_filename("Our awesome presentation v0.pptx")
s2_clean = clean_filename("our_awesome_presentation v1.pptx")

# 计算编辑距离并转换为相似度
distance = edit_distance(s1_clean, s2_clean)
similarity = 1 - distance / max(len(s1_clean), len(s2_clean))

三、完整清理流程

  1. 预处理所有文件:遍历文件夹,对每个文件名做清理,同时记录文件的路径、最后修改时间、创建时间。
  2. 分组相似文件:按文件后缀先分组(比如pptx、docx分别处理),再在同后缀组内计算文件相似度,设置阈值(比如0.8),将相似度高于阈值的文件归为同一组。
  3. 保留最优文件:在每个分组中,选择最后修改时间最新的文件作为保留对象,其余标记为待删除。
  4. 安全清理:先备份文件夹,再删除标记的文件(建议先打印待删除列表确认后再执行删除)。

注意事项

  • 务必先备份文件夹,避免误删重要文件。
  • 可以先在小范围文件中测试相似度阈值,调整到符合自己需求的水平。
  • 针对数万级文件,避免全量两两计算相似度,按后缀分组能大幅减少计算量。

内容的提问来源于stack exchange,提问作者ste_kwr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:36:01