详解如何使用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
0
投稿
猜你喜欢
- 第一次做完主从库同步后正常,但工作过程中发现有一个库的数据库没有同步起来,在另外一个mysql(3307)中于是:1、在主库中创建一个临时库
- (一)问题遗传算法求解正方形拼图游戏(二)代码#!/usr/bin/env python# -*- coding: utf-8 -*-fro
- 代码如下:--建立数据表createtable TestData ( ID int identity(1,1) primary key, D
- Python3.6.4必须downgrade成3.5pip版本最低9.0.3自己的电脑必须已经安装好git关于anaconda prompt
- 本文实例讲述了php控制文件下载速度的方法。分享给大家供大家参考。具体实现方法如下:<?php /* * set here a lim
- 一.脚本基础1.USE语句设置当前数据库。2.声明变量语法:DECLARE @变量名 变量类型在声明变量后,给变量赋值之前,变量的值为NUL
- 本文实例讲述了Python实现判断并移除列表指定位置元素的方法。分享给大家供大家参考,具体如下:问题很简单,输入一个列表和索引,若索引超出列
- 如何自动反馈电子邮件?很多网站上的电子邮件都是自动回复的,就象163电子邮局提供的邮件自动回复功能一样。这是怎么实现的?我们可以用ASPMa
- 本文讲解如何设置SQL Server数据库全文索引服务。在Microsoft SQL Server 7.0 中提供了全文索引服务(Full-
- 如何在第10000名来访者访问时显示中奖页面?看看下面的代码:< SCRIPT LANGUAGE=VBScript
- 字符串Go语言中的字符串以原生数据类型出现。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(")中的内容
- 在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高
- 手写数字识别算法import pandas as pdimport numpy as npfrom sklearn.neural_netwo
- 前言python号称是编程界的万金油,那么是否可以做个读取电脑网卡wifi并暴力破解的小脚本呢?在这个基础上为了方便体验是不是可以将其打包成
- Linux终端里面可谓是奇妙无限,很多优秀的软件都诞生在终端里面。相较之下,Windows本身的理念和Linux就不一致,所以,你懂得。 下
- 由于可将 Microsoft? SQL Server? 2000 设置为包含一个或多个命名实例和一个默认实例(也可无),所以要用新命名规则来
- 今天暴风彬彬要讨论的网站可用 * ,是让你的网站文字链接提高一定的可用性,而且实现起来非常简单,其实这也算是提高用户体验的方法。扩大可点击区
- 突然发现自己对Web前端技术掌握得很少很少,就是自己最感兴趣的XHTML+CSS部分知道也不算多。在XHTML 1.1规定的诸多元素中,我平
- 尽管有很多规范URL的标准,例如RFC 3987,但实际应用中却非常混乱。本文主要介绍浏览器发送URL到服务器的一些特性,作为开发和应用的参
- mapmap(function,iterable)x = [1,2,3,4,5]def square(num): return num*nu