如何用Python实现清理重复的文件
Admin 2022-11-04 群英技术资讯 851 次浏览
在日常操作或是项目的实际应用中,有不少朋友对于“如何用Python实现清理重复的文件”的问题会存在疑惑,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。已知条件:
什么都不知道,只需要知道它是文件就可以了
实现方法:
可以从指定路径(或最上层路径)开始读取,利用 glob 读取每个文件夹,读到文件,记录名称和大小,每一次检测之前是否读取过相同名称的文件,如果存在,判断大小是否相同,如果相同,我们就认为这是重复文件,将其删除。
代码示例如下:
# coding:utf-8
import glob
import os.path
data = {} # 定义一个空的字典,暂时将文件名存进来
def clear(path):
result = glob.glob(path) # 将 path 路径传入,赋值给 result
for _data in result: # for 循环判断是否是文件夹
if glob.os.path.isdir(_data): # 若是文件夹,继续将该文件夹的路径传给 clear() 函数继续递归查找
_path = glob.os.path.join(_data, '*')
clear(_path)
else: # 若是文件,则将文件名提取出来
name = glob.os.path.split(_data)[-1]
if 'zip' in name: # 因为目前我们测试的 path 下有 ".zip" 文件,所以这里跳过 '.zip' 压缩文件的读取否则会报错
continue
f = open(_data, 'r') # 判断文件名之前先将内容读取出来,若是不可读模式
content = f.read() # 将读取内容赋值给 content
if name in data: # 判断文件名是否已存在 data 这个临时存储文件名的字典内,如果存在则进行执行删除动作
_content_dict = data[name]
if _content_dict == content:
print('文件 \"{}\" 被删除...'.format(_data)) # 调试
os.remove(_data)
else:
data[name] = content
if __name__ == '__main__':
path = glob.os.path.join(glob.os.getcwd(), 'test_file')
clear(path)
PS:这里需要注意一下,如果path的路径是根目录的话,会出现超级意外的结果,建议还是建立一个单独的文件夹路径来测试吧。(这个坑踩的我很心痛....)
运行结果如下:

其实在这里大家能够想到一个问题,可能会存在这样一种情况,在不同的文件夹下存在着相同文件名,但是文件的内容却是不相同的。如果利用上面的脚本执行针对文件夹下相同文件名的文件进行删除的话,其实是一种不严谨的操作。
由此也就引出了我们接下来针对上文脚本优化的需求。
这里我们先看一下实际情况的 data 的值应该是怎样的:data = {'name': {'path/name': 'content', 'path2/name': 'content'}}
通过这种二级路径与内容删除的重复文件才是一种比较合理的方式。
示例代码如下:
# coding:utf-8
import glob
import os.path
data = {} # 定义一个空的字典,暂时将文件名存进来
def clear(path):
result = glob.glob(path) # 将 path 路径传入,赋值给 result
for _data in result: # for 循环判断是否是文件夹
if glob.os.path.isdir(_data): # 若是文件夹,继续将该文件夹的路径传给 clear() 函数继续递归查找
_path = glob.os.path.join(_data, '*')
clear(_path)
else: # 若是文件,则将文件名提取出来
name = glob.os.path.split(_data)[-1]
if 'zip' in name: # 因为目前我们测试的 path 下有 ".zip" 文件,所以这里跳过 '.zip' 压缩文件的读取否则会报错
continue
f = open(_data, 'r') # 判断文件名之前先将内容读取出来,若是不可读模式
content = f.read() # 将读取内容赋值给 content
if name in data: # 判断文件名是否已存在 data 这个临时存储文件名的字典内,如果存在则进行执行删除动作
# 如果不存在,则将读取到的二级路径与内容存储至 data 这个空字典内
sub_name = data[name] # 定义 sub_name 用以获取二级路径
is_delete = False # is_delete 用以记录删除状态;如果没有删除,还需要将二级路径添加至 data
for k, v in sub_name.items(): # 再次循环判断二级路径下的文件;k 为路径,v 为文件内容
print('二级路径为 \"{}\" ,'.format(k), name, '内容为 \'{}\' '.format(v)) # 调试打印输出二级路径下文件的循环
if v == content: # 如果文件名与内容相同,则执行删除动作
print('文件 \"{}\" 被删除...'.format(_data)) # 调试被删除的文件
os.remove(_data) # 删除重复文件后,变更 is_delete 状态为True
is_delete = True
if not is_delete: # 如果没有删除则将 content 读取到的内容赋值给 data[name][_data]
data[name][_data] = content
else:
data[name] = {
_data: content
}
if __name__ == '__main__':
path = glob.os.path.join(glob.os.getcwd(), 'test_file')
clear(path)
print(data)
运行结果如下:

到此,关于“如何用Python实现清理重复的文件”的学习就结束了,希望能够解决大家的疑惑,另外大家动手实践也很重要,对大家加深理解和学习很有帮助。如果想要学习更多的相关知识,欢迎关注群英网络,小编每天都会给大家分享实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文主要介绍的python排序算法的实现,下本有冒泡排序、选择排序、插入排序、快速排序这四种排序的算法实现步骤以及实现的介绍,和四种算法实现的比较,具有一定的参考价值。下面一起跟随小编看看吧。
Python内置函数-super()函数。super() 函数是用于调用父类(超类)的一个方法。
这篇文章给大家分享的是有关pytorch实现变量类型转换的内容,其实变量类型转换的方法有很多,因此下面小编和大家一起探究变量类型转换的方法有哪些?怎样实现?感兴趣的朋友就继续往下看吧。
这篇文章主要为大家介绍了python神经网络Keras实现LSTM及其参数量详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了python time模块 时间戳 与 结构化时间的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008