详解如何使用Python实现删除重复文件
作者:冫马讠成 发布时间:2022-08-14 04:33:54
标签:Python,删除,重复,文件
Python自动化办公之删除重复文件
思路介绍
两层判断:
1.先判断文件大小是否为相同,大小不同则不是重复文件,予以保留;
2.文件大小相同再判断文件md5,md5相同,则是重复文件,予以删除。
源码解说
from pathlib import Path
import hashlib
def getmd5(filename):
# 接收文件路径,返回文件md5值
with open(filename, 'rb') as f:
data = f.read()
file_md5 = hashlib.new("md5", data).hexdigest()
return file_md5
def main():
path = r"F:\FileRecv\删除文件测试"
all_size = {}
total_file = 0
total_delete = 0
# 获取路径内的所有文件名,默认是升序排列,相同文件将会保留日期时间最新的
all_files = Path(path).glob('*.*')
# 降序排列,相同文件将会保留文件名最短的(即日期时间最久的)
all_files = sorted(all_files, reverse=True)
# 遍历文件路径内的所有文件
for file in all_files:
# 获取文件所占字节大小,作为数据字典的键
size = file.stat().st_size
# name_and_md5列表用于存储文件绝对路径和md5值,作为数据字典的值
name_and_md5 = [file, '']
# 针对重复文件进行处理,生成字典存储相关信息
# 字典all_size中key是size,value是name_and_md5列表
# 针对相同size的文件,再调用getmd5函数,获取文件的md5值
# 文件size不同(不在all_size.keys()中),则自动判断为不同的文件,予以保留
if size in all_size.keys():
# 调用getmd5函数,获取文件的md5值
new_md5 = getmd5(file)
if all_size[size][1] == '':
all_size[size][1] = getmd5(all_size[size][0])
# 判断md5值存在,即文件重复,则删除文件。md5值不存在,则把md5值加入列表中
if new_md5 in all_size[size]:
file.unlink()
total_delete += 1
else:
all_size[size].append(new_md5)
else:
all_size[size] = name_and_md5
total_file += 1
print(f'文件总数:{total_file}')
print(f'删除个数:{total_delete}')
if __name__ == '__main__':
main()
效果图:
代码说明:特别感谢瑜亮老师提供的代码!
知识拓展
pathlib和os,os.path常用的函数对应关系
pathlib常用方法介绍:
Path(path).name # 返回文件名+文件后缀
Path(path).stem # 返回文件名
Path(path).suffix # 返回文件后缀
Path(path).suffixes # 返回文件后缀列表
Path(path).root # 返回根目录
Path(path).parts # 返回文件
Path(path).anchor # 返回根目录
Path(path).parent # 返回父级目录
Path(path).parents # 返回所有上级目录的列表
Path.exists() # 判断 Path 路径是否是一个已存在的文件或文件夹
Path.is_dir() # 判断 Path 是否是一个文件夹
Path.is_file() # 判断 Path 是否是一个文件
Path.mkdir() # 创建文件夹
Path.rmdir() # 删除文件夹,文件夹必须为空
Path.unlink() # 删除文件
来源:https://mp.weixin.qq.com/s/7soU0wT3B4fufZ8s2Cyy5Q


猜你喜欢
- 有时候想为我们的网页提供多语言支持,如果一种语言用一张网页来做实在太麻烦了,幸好Google提供了语言工具功能,下面介绍如何利用它来实现网页
- 目录1 figure1.1 创建figure1.2 figure的常用设置1.2.1 set方法通用设置1.2.2 设置figure标题1.
- 哥德巴赫猜想:大于8的偶数之和都可以被两个素数相加范围 8 - 10000思路:首先不要去管需要什么什么东西实现,所以我们如果知道如何去完成
- 比如有两个模块,一个aa.py,一个bb.py 代码如下:aa.py:#encoding:utf-8import bba=1bb.py:#e
- 数据import numpy as npimport pandas as pddata = [{'Name': '小
- 以GraphViz为例:下载安装好的路径名字为C:/Program Files (x86)/Graphviz2.38import osos.
- 枚举是常用的功能,看看Python的枚举.from enum import EnumMonth = Enum('Month'
- 最近再写openpose,它的网络结构是多阶段的网络,所以写网络的时候很想用列表的方式,但是直接使用列表不能将网络中相应的部分放入到cuda
- 这是一个通过js实现的支付后的页面,点击支付会跳出一个弹窗,提示你是否要确定支付,确定后进入付后界面,该页面有着10秒倒计时,计时结束后便会
- 项目需要,做一个和今日头条一样的导航栏,可以横行滚动,幸好再weui里面看到了类似的例子地址:https://weui.shanliwawa
- 一,命名空间函数 tf.variable_scope tf.name_scope 先以下面的代码说明两者的区别# 命名空间管理函数'
- 本文实例为大家分享了PyQt5单行文本框展示的具体代码,供大家参考,具体内容如下QLineEdit 是一个允许输入和编辑纯文本的单行控件。系
- 通过LogMiner实现Oracle数据同步迁移为了实现Oracle数据库之间的数据同步,网上的资料比较少的时候。最好用的Oracle数据库
- Mysql 查询时间段交集使用场景数据库表有两个字段starttime,endtime。现在给出(a,b)的时间段,查出和(starttim
- 一、用HTTP头信息 也就是用PHP的HEADER函数。PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WE
- 一、前言在程序中,有很多高效率的字符串处理方式,如果开发者能够完全掌握这些高效的字符串处理,往往在开发者也能事半功倍。比如针对于字符串的处理
- 前言本文主要给大家介绍了关于Yii2结合Workerman的websocket的相关内容,两者都是好东西,我就想着能不能结合起来,这样Yii
- 近期,MSN、江民等知名网站相继受到了黑客的威胁和攻击,一时间网络上风声鹤唳。本报编辑部接到本文作者(炽天使)的电话,他详细讲述了发现国内最
- 进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念:1.定义进程是具有一定独立功能的程序关
- 具体方法:1使用panda read_excel 方法加载excel2使用concat将DataFrame列表进行拼接3然后使用pd.Exc