如何用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))
三、完整清理流程
- 预处理所有文件:遍历文件夹,对每个文件名做清理,同时记录文件的路径、最后修改时间、创建时间。
- 分组相似文件:按文件后缀先分组(比如pptx、docx分别处理),再在同后缀组内计算文件相似度,设置阈值(比如0.8),将相似度高于阈值的文件归为同一组。
- 保留最优文件:在每个分组中,选择最后修改时间最新的文件作为保留对象,其余标记为待删除。
- 安全清理:先备份文件夹,再删除标记的文件(建议先打印待删除列表确认后再执行删除)。
注意事项
- 务必先备份文件夹,避免误删重要文件。
- 可以先在小范围文件中测试相似度阈值,调整到符合自己需求的水平。
- 针对数万级文件,避免全量两两计算相似度,按后缀分组能大幅减少计算量。
内容的提问来源于stack exchange,提问作者ste_kwr
相关产品推荐
相关产品推荐

