首页 > 编程语言 >扫描并清除重复文件的Python脚本

扫描并清除重复文件的Python脚本

时间:2023-12-11 15:46:10浏览次数:39  
标签:文件 hash fname Python 清除 扫描 list file directory

电脑里存的照片越来越多,其中有很多是重复的。如果依赖人边去一张一张对比,需要的工作量太大了。

下面的Python脚本在一个目录树上递归地对所有文件作MD5校验,将重复的文件找出来。保留用户指定的文件,将多余的文件全部删除掉。

#!/usr/bin/env python3

import sys
import hashlib
import os

POOL = {}

def md5_hash(fname):
    with open(fname, 'rb') as f:
        data = f.read()
        return hashlib.md5(data).hexdigest()


def handle_file(fname):
    hash = md5_hash(fname)
    t = POOL.get(hash)
    if t:
        POOL[hash].append(fname)
    else:
        POOL[hash] = [fname]
    
def walk_dir(directory, fun):
    files = os.listdir(directory)
    for f in files:
        path = os.path.join(directory, f)
        if os.path.isdir(path):
            walk_dir(path, fun)
        else:
            fun(path)
    
if __name__ == '__main__':
    if len(sys.argv) > 1:
        directory = sys.argv[1]
    else:
        directory = '.'
        
    # scan the directory
    walk_dir(directory, handle_file)
    
    for hash, file_list in POOL.items():
        if len(file_list) > 1:
            print()
            for i in range(len(file_list)):
                print(f"{i} - {file_list[i]}")
            select = input('\n以上文件重复,请输入要保留的编号\nA.全部保留, Q.退出, 默认保留第 0 个: ') or '0'
            if select.upper() == 'A':
                continue
            if select.upper() == 'Q':
                sys.exit(0)
            keep = int(select)
            for i in range(len(file_list)):
                if i != keep:
                    os.remove(file_list[i])
    print('Success')

所有的文件散列值都保存在内存中,只有在所有文件都扫描完成后才会有结果。所以,如果你试图用它去扫描一个很巨大的目录树,您就慢慢等吧!

吐槽一下现在的手机系统,我的重复文件绝大部分来源于手机。通常是云空间或者是微信贡献的。特别是微信对存储空间的浪费,简直令人发指。

最后,脚本的交互似乎需要改进。对于每一组重复的文件都需要用户指定要保留的文件。这是我自己的需要决定的。其他人可能并不在意要保留哪个文件,只需要任意保留一个副本即可。对于这些用户,可以一直按回车就行了。我不想把程序的逻辑搞复杂。

标签:文件,hash,fname,Python,清除,扫描,list,file,directory
From: https://www.cnblogs.com/zh-geek/p/17894549.html

相关文章

  • node调用python输出中文乱码问题
    问题描述使用node的children_process模块调用python脚本文件,出现输出信息为乱码问题//node脚本const{spawn}=require('child_process');constpythonProcess=spawn('python',['./test.python']);pythonProcess.stdout.on('data',(data)=>{......
  • Python_数据结构的应用heap
    数据结构栈-->stack队列-->queue树-->tree堆-->heap散列-->hash图-->graph图结构一般包括顶点和边邻接矩阵DAG,DirectedAcyclicGraph即「有向无环图」树树(Tree)是一种非线性的数据结构,由n个节点组成,其中每个节点都有零个或多个子节点。......
  • python数据类型元组、列表、集合、字典相互嵌套
    系统Windows10专业工作站版22H2软件python-3.9.6-amd64.exe拓展库:jupyter==1.0.0notebook==7.0.61.元组嵌套1.1元组嵌套元组try:tuple0=((1,2,3),(1,2,3),(1,2,3))print(tuple0,type(tuple0))except:print('error')((1,2,3),(1,2,3),(1,2,......
  • map(python中的字典)
    //创建一个空的map,键是字符串类型,值是整数类型myMap:=make(map[string]int)//创建有值的map//初始化并赋值myMap:=map[string]int{"apple":1,"banana":2,"orange":3,}//添加修改元素myMap["grape"]=4//添加元素myMa......
  • 【python基础之函数】--- 函数入门
    title:【python基础之函数】---函数入门date:2023-12-0818:50:06updated:2023-12-1114:30:00description:cover:https://home.cnblogs.com/u/dream-ze/函数的基本使用目前为止,借助之前的学习内容,是已经能开发一些功能简单的小程序了但随着程序功能......
  • 在自动化测试时,Python常用的几个加密算法,你有用到吗
    本文分享自华为云社区《『加密算法』|自动化测试时基于Python常用的几个加密算法实现,你有用到吗?》,作者:虫无涯。写在前边这几天做自动化测试,遇到一个问题,那就是接口的请求的密码是加密的;产品的要求是不能使用其他特殊手段,他给提供加密算法,需要在接口请求的时候,使用加密算法处......
  • Python语言合并列表元素常用的方法!
    众所周知,列表是Python中常见的数据类型,它可以存储多个元素。但由于某种需求,我们有时候需要将多个元素进行合并,那么Python语言如何合并列表中的元素?以下是常用方法介绍。1、使用+运算符在Python中,可以使用+运算符将两个列表的元素合并成一个新的列表。例如,假设有两个列......
  • python 怎么组织代码?
    参考:https://www.liaoxuefeng.com/wiki/1016959663602400/10174541450141761.为什么不能把代码写到一个.py中?实际开发中,我们不可能把所有的代码都写到一个.py文件中,看起来太累了,并且难以修改,修改后难免要考虑会不会影响别的。解决方法:把很多函数分组,分别放到不同的文件里,......
  • [Python急救站]文件管理工具
    对于一个程序员,有时候文件太多,忘记放哪里了,那有没有一个可以帮你定位到文件的文件管理工具呢,抱着这样的想法,我做了以下这个代码,可以快速定位找到文件所在位置。importosimporttkinterastkimporttimeimportsubprocess#函数用于搜索文件defsearch_files():file......
  • Linux学习36- python3.9出现ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+
    遇到问题python3.9上安装requests库,requests包引入了urllib3,而新版本v2.x的urllib3需要OpenSSL1.1.1+以上版本所以就出现了报错File"/root/python39/lib/python3.9/site-packages/_pytest/assertion/rewrite.py",line186,inexec_moduleexec(co,module.__dict__......