发布时间:2024-01-02 15:30
已知条件:
什么都不知道,只需要知道它是文件就可以了
实现方法:
可以从指定路径(或最上层路径)开始读取,利用 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自动化办公之清理重复文件详解的文章就介绍到这了,更多相关Python清理重复文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!