- 示例工程
【免费下载链接】python-mini-projects
A collection of simple python mini projects to enhance your python skills
本指南围绕开源仓库 python-mini-projects 中的 Duplicate Files Remover 项目展开,系统讲解如何用纯 Python 标准库实现"扫描目录 → 计算文件哈希 → 删除内容重复文件"的完整流程。阅读本文后,你将掌握分块读取文件计算 MD5 的实现技巧、基于哈希字典的去重策略,以及该方案在实际使用中的边界与注意事项,可以直接在自己的目录中运行和扩展这套去重逻辑。
工具定位与适用场景
Duplicate Files Remover 是一个单文件、零第三方依赖的 Python 脚本,其核心目标非常明确:删除脚本所在目录中的重复文件。它通过对比文件内容的 MD5 哈希来判断两个文件是否重复,一旦发现哈希相同,就删除后出现的那个文件,从而释放磁盘空间。
它特别适合以下场景:
- 下载目录或文档目录中存在大量内容相同、文件名不同的副本;
- 备份文件夹中积累了多份同名或异名的相同内容;
- 需要快速清理某个目录中的冗余文件,而又不想引入 GUI 工具或重量级去重软件。
由于脚本只作用于"脚本运行时所在的当前目录",操作范围清晰可控,适合作为理解"哈希去重"这一经典思路的入门示例。
快速开始:环境要求与运行方式
依赖清单
根据项目 README 的说明,脚本不依赖任何外部库,仅使用 Python 标准库中的两个模块:
| 模块 | 用途 |
|---|---|
os | 遍历当前目录、判断文件、删除文件 |
hashlib | 计算文件的 MD5 哈希 |
这意味着只要系统安装了 Python 3 即可直接运行,无需执行pip install任何包。
运行方式
将终端切换到目标目录后,直接执行:
python3 duplicatefileremover.py脚本会在当前工作目录中完成扫描、比对与删除,并在终端打印被删除的文件清单(详见下文"运行效果"一节)。运行前建议先对目录中的文件做一次备份,或先在测试目录中试用,因为该脚本的删除操作是不可恢复的。
工作原理:一条主线、三个步骤
README 对脚本工作方式给出了精炼概括:脚本先列出目录中的所有文件,然后逐一计算每个文件的 MD5 哈希;当两个文件的哈希相同时,就删除后出现的文件。结合源码可以拆解为三个核心步骤:
- 枚举文件:使用
os.listdir()列出当前目录的全部条目,并用os.path.isfile()过滤出其中的文件(目录、子目录不会被纳入); - 计算哈希:对每个文件调用
hashFile(),得到其内容的 MD5 十六进制摘要; - 比对去重:以哈希值为键维护一个字典;若某哈希已存在,说明内容重复,执行
os.remove()删除该文件;否则将哈希与文件名记入字典,作为"保留样本"。
从实现上看,脚本默认保留第一个遇到的文件,删除之后所有哈希相同者。
源码剖析一:hashFile 分块哈希的实现细节
去重正确性的根基在于哈希计算。hashFile函数位于 duplicatefileremover.py,其实现如下:
def hashFile(filename): # For large files, if we read it all together it can lead to memory overflow, # So we take a blocksize to read at a time BLOCKSIZE = 65536 hasher = hashlib.md5() with open(filename, 'rb') as file: # Reads the particular blocksize from file buf = file.read(BLOCKSIZE) while(len(buf) > 0): hasher.update(buf) buf = file.read(BLOCKSIZE) return hasher.hexdigest()几个值得注意的实现要点:
- 分块读取,控制内存占用:代码注释明确指出,一次性读取大文件可能导致内存溢出,因此采用
BLOCKSIZE = 65536(即 64 KB)的分块策略,逐块送入hasher.update()。无论文件多大,单次驻留内存的数据量都被限制在 64 KB 级别,这是处理大文件时的关键工程实践。 - 以二进制模式打开:
open(filename, 'rb')确保哈希计算基于原始字节流,不受文本编码、换行符转换(如 Windows 的\r\n)影响,保证"内容相同即哈希相同"的判定准确。 - 流式更新哈希:
hashlib.md5()对象支持update()增量更新,最终通过hexdigest()返回 32 位十六进制字符串,作为文件的唯一指纹。 - 循环终止条件:
while(len(buf) > 0)在读到文件末尾(read返回空字节串)时退出,逻辑简洁且能覆盖空文件(空文件也会得到一个固定的 MD5 值,因此两个空文件同样会被识别为重复)。
源码剖析二:主流程与去重策略
主流程位于 duplicatefileremover.py:
if __name__ == "__main__": # Dictionary to store the hash and filename hashMap = {} # List to store deleted files deletedFiles = [] filelist = [f for f in os.listdir() if os.path.isfile(f)] for f in filelist: key = hashFile(f) # If key already exists, it deletes the file if key in hashMap.keys(): deletedFiles.append(f) os.remove(f) else: hashMap[key] = f if len(deletedFiles) != 0: print('Deleted Files') for i in deletedFiles: print(i) else: print('No duplicate files found')逐段解读其设计:
hashMap字典:以"文件内容哈希 → 文件名"为映射,是去重的核心数据结构。Python 字典基于哈希表实现,key in hashMap.keys()的查询为平均 O(1) 复杂度,因此对海量文件的比对也不会退化为两两穷举。filelist列表推导:[f for f in os.listdir() if os.path.isfile(f)]只收集当前目录中的文件条目。需要说明的是,os.listdir()仅枚举一层目录,不会递归进入子目录;os.path.isfile()会跟随符号链接,因此指向文件的软链接也会被纳入比对范围。- 先到先留、后到即删:遍历时第一个文件存入
hashMap,后续哈希命中者立即os.remove(f)删除,并将文件名追加进deletedFiles用于输出汇报。整个删除过程发生在扫描的同一趟循环中。 - 结果汇报:若存在删除记录,则打印
Deleted Files标题与完整清单;否则打印No duplicate files found,反馈清晰直观。
运行效果:终端输出解读
上图是脚本在 Linux 终端中的真实运行效果(截图来自项目仓库):执行python3 duplicatefileremover.py后,脚本输出Deleted Files标题,随后逐行列出被删除的重复文件(如57w.txt、5ay.txt、28w.txt等大量.txt副本),验证了"内容相同的文件只保留一个、其余全部清理"的实际行为。若目录中不存在任何重复文件,则会输出No duplicate files found。
边界条件与使用注意事项
以下内容基于源码结构推断,供实际使用时参考:
- 删除操作不可恢复:
os.remove()是永久删除,不会移入回收站。建议首次使用前在副本目录中试运行,或先修改脚本将删除改为"移动到备份目录"。 - MD5 哈希碰撞的理论风险:MD5 属于 128 位哈希,工程实践中碰撞概率极低,但严格来说并非绝对安全。对于追求极致可靠性的场景,可改用
hashlib.sha256(),仅需替换hashFile中的算法一行。 - 无异常处理:从源码结构看,脚本未对
os.remove()的失败(如文件权限不足、文件被占用)做try/except捕获,遇到异常时程序会直接中断。在多用户或只读目录下运行时需注意这一点。 - 仅覆盖当前目录:
os.listdir()不递归,子目录中的重复文件不会被处理;如需全盘清理,可以自行扩展为os.walk()递归遍历。 - 先到先留的取舍:脚本保留第一个遇到的、删除后续重复者,无法选择"保留最新文件"或"保留指定目录中的文件"。若需要保留策略可扩展,需在删除前增加文件修改时间等条件的判断。
总结
Duplicate Files Remover 用不足 40 行代码完整展示了"哈希去重"这一经典方案的工程实现:hashlib负责内容指纹,os负责文件枚举与删除,分块读取策略保证了处理大文件时的内存安全,字典结构保证了比对的线性效率。对于希望理解文件系统操作、哈希算法应用或需要快速搭建目录清理工具的开发者而言,README 与 duplicatefileremover.py 是一份简洁而完整的参考样例。
- 示例工程
【免费下载链接】python-mini-projects
A collection of simple python mini projects to enhance your python skills
相关推荐
python-mini-projects 之 Merge_pdfs:基于 PyPDF2 的 PDF 合并脚本实战解析
python mini projects 之 Merge_pdfs:基于 PyPDF2 的 PDF 合并脚本实战解析 PDF 合并是日常文档处理中最常见的需求之
示例工程python-mini-projects 实战:基于 OpenWeatherMap API 的当前天气查询脚本(Fetch_current_weather)
python mini projects 实战:基于 OpenWeatherMap API 的当前天气查询脚本(Fetch_current_weather) 导
示例工程图书搜索去重终极指南:基于MD5哈希的智能数据清理方案
图书搜索去重终极指南:基于MD5哈希的智能数据清理方案 在数字阅读时代,个人图书馆的规模日益增长,但重复书籍文件不仅占用宝贵存储空间,还会降低搜索效率。本文将介
搜索引擎后端前端桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考