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 04 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
Jul 15 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
Python vtk读取并显示dicom文件示例
Jan 13 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/10/29 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
详解javascript高级定时器
2015/12/31 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python轻松查到删除自己的微信好友
2016/01/10 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Python PIL库图片灰化处理
2020/04/07 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
酒店大堂副理的职责范文
2014/02/13 职场文书
趣味运动会标语口号
2015/12/26 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL
Oracle中日期的使用方法实例
2022/07/07 Oracle