python实现自动清理重复文件


Posted in Python onAugust 24, 2020

前言

大家好,又到了Python办公自动化系列。

今天分享一个系统层面的自动化案例:

「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」

主要涉及的知识点有:

  • os模块综合应用
  • glob模块综合应用
  • 利用filecmp模块比较两个文件

步骤分析

该程序实现的逻辑可以具化为:

遍历获取给定文件夹下的所有文件,然后通过嵌套循环两两比较文件是否相同,如果相同则删除后者。

实现问题的关键就变成了?

如何判断两个文件是否相同?

在这里我们可以使用filecmp模块,来看看官方的介绍文档:

  • filecmp.cmp(f1, f2, shallow=True)
  • 比较名为f1和f2的文件,如果它们似乎相等则返回True,否则返回False
  • 如果shallow为真,那么具有相同os.stat()签名的文件将会被认为是相等的。否则,将比较文件的内容。

所以可以这样使用?

# 假设x和y两个文件是相同的
print(filecmp.cmp(x, y))
# True

解决了这个问题,我们就可以开始写代码了!

Python实现

导入需要的库并设置目标文件夹路径

import os
import glob
import filecmp

dir_path = r'C:\\xxxx'

接着遍历获取所有文件的绝对路径,我们可以利用glob模块的通配符结合recursive参数即可完成,框架如下:

for file in glob.glob(path + '/**/*', recursive=True):
  pass

由于遍历获取每一个文件或者文件夹后,需要判断是否是文件,如果是文件则可能将绝对路径存放到列表中,这里需要再完成两个事情:

  1. 首先创建一个空列表,后面用list.append(i)添加文件路径
  2. 接着利用os.path.isfile(i)判断是否是文件,返回True则执行添加元素的操作

具体代码如下

file_lst = []

for i in glob.glob(dir_path + '/**/*', recursive=True):
  if os.path.isfile(i):
    file_lst.append(i)

上一步我们获取了目标文件夹下的所有文件路径,接下来就可以嵌套遍历这个路径列表,其中filecmp.cmp进行文件判断,os.remove进行文件删除

for x in file_lst:
  for y in file_lst:
    if x != y:
      if filecmp.cmp(x, y):
        os.remove(y)

这里的代码已经实现了大致逻辑,但有一个细节需要考虑到:有可能循环到文件已经被前面的判断删除了,导致os.remove(file)由于文件不存在而报错

因此,可以用os.path.exists对文件存在进行判断,如下所示:

for x in file_lst:
  for y in file_lst:
    if x != y and os.path.exists(x) and os.path.exists(y):
      if filecmp.cmp(x, y):
        os.remove(y)

这样,一个简易的文件去重小程序就完成了,完整代码如下:

import os
import glob
import filecmp

dir_path = r'C:\xxxx'

file_lst = []

for i in glob.glob(dir_path + '/**/*', recursive=True):
  if os.path.isfile(i):
    file_lst.append(i)

for x in file_lst:
  for y in file_lst:
    if x != y and os.path.exists(x) and os.path.exists(y):
      if filecmp.cmp(x, y):
        os.remove(y)

写在最后

通过本文的Python自动化脚本制作过程,我们可以再次体会Python办公自动化的强大,同时本次实现的功能可以和之前自动整理文件的脚本结合使用!

以上就是python实现自动清理重复文件的详细内容,更多关于python清理重复文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中自定义函数的教程
Apr 27 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
Python实战之实现康威生命游戏
Apr 26 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 #Python
Python+pyftpdlib实现局域网文件互传
Aug 24 #Python
实例代码讲解Python 线程池
Aug 24 #Python
详解python UDP 编程
Aug 24 #Python
PyTorch如何搭建一个简单的网络
Aug 24 #Python
Python pysnmp使用方法及代码实例
Aug 24 #Python
详解python tcp编程
Aug 24 #Python
You might like
php判断一个数组是否为有序的方法
2015/03/27 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
PHP代码加密的方法总结
2020/03/13 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
详解Nodejs之npm&package.json
2017/06/15 NodeJs
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
使用Python求解最大公约数的实现方法
2015/08/20 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
Django开发中复选框用法示例
2018/03/20 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
Python制作词云图代码实例
2019/09/09 Python
学生发电厂实习自我鉴定
2013/09/22 职场文书
大三学生入党思想汇报
2014/01/02 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
信息管理专业自荐书
2014/06/05 职场文书
工作目标责任书
2014/07/23 职场文书
委托书的格式
2014/08/01 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
 python中的元类metaclass详情
2022/05/30 Python