如何用Python寻找重复文件并删除
来源:互联网 发布:天刀捏脸数据导入 编辑:程序博客网 时间:2024/05/23 11:01
在实际生活中,经常会有文件重复的困扰,即同一个文件可能既在A目录中,又在B目录中,更可恶的是,即便是同一个文件,文件名可能还不一样。在文件较少的情况下,该类情况还比较容易处理,最不济就是one by one的人工比较——即便如此,也很难保证你的眼神足够犀利。倘若文件很多,这岂不是个impossible mission?最近在看《Python UNIX和Linux系统管理指南》,里面就有有关“数据比较”的内容,在其基础上,结合实际整理如下。
该脚本主要包括以下模块:diskwalk,chechsum,find_dupes,delete。其中diskwalk模块是遍历文件的,给定路径,遍历输出该路径下的所有文件。chechsum模块是求文件的md5值。find_dupes导入了diskwalk和chechsum模块,根据md5的值来判断文件是否相同。delete是删除模块。具体如下:
1. diskwalk.py
import os,sysclass diskwalk(object): def __init__(self,path): self.path = path def paths(self): path=self.path path_collection=[] for dirpath,dirnames,filenames in os.walk(path): for file in filenames: fullpath=os.path.join(dirpath,file) path_collection.append(fullpath) return path_collectionif __name__ == '__main__': for file in diskwalk(sys.argv[1]).paths(): print file
2. chechsum.py
import hashlib,sysdef create_checksum(path): fp = open(path) checksum = hashlib.md5() while True: buffer = fp.read(8192) if not buffer:break checksum.update(buffer) fp.close() checksum = checksum.digest() return checksumif __name__ == '__main__': create_checksum(sys.argv[1])
3. find_dupes.py
from checksum import create_checksumfrom diskwalk import diskwalkfrom os.path import getsizeimport sysdef findDupes(path): record = {} dup = {} d = diskwalk(path) files = d.paths() for file in files: compound_key = (getsize(file),create_checksum(file)) if compound_key in record: dup[file] = record[compound_key] else: record[compound_key]=file return dupif __name__ == '__main__': for file in findDupes(sys.argv[1]).items(): print "The duplicate file is %s" % file[0] print "The original file is %s\n" % file[1]
findDupes函数返回了字典dup,该字典的键是重复的文件,值是原文件。这样就解答了很多人的疑惑,毕竟,你怎么确保你输出的是重复的文件呢?
4. delete.py
import os,sysclass deletefile(object): def __init__(self,file): self.file=file def delete(self): print "Deleting %s" % self.file os.remove(self.file) def dryrun(self): print "Dry Run: %s [NOT DELETED]" % self.file def interactive(self): answer=raw_input("Do you really want to delete: %s [Y/N]" % self.file) if answer.upper() == 'Y': os.remove(self.file) else: print "Skiping: %s" % self.file returnif __name__ == '__main__': from find_dupes import findDupes dup=findDupes(sys.argv[1]) for file in dup.iterkeys(): delete=deletefile(file) #delete.dryrun() delete.interactive() #delete.delete()
deletefile类构造了3个函数,实现的都是文件删除功能、其中delete函数是直接删除文件,dryrun函数是试运行,文件并没有删除,interactive函数是交互模式,让用户来确定是否删除。这充分了考虑了客户的需求。
总结:这四个模块已封装好,均可单独使用实现各自的功能。组合起来就可批量删除重复文件,只需输入一个路径。
0 0
- 如何用Python寻找重复文件并删除
- 如何用SQL删除重复记录
- 如何用SQL语句删除数据库中的重复行?
- 轮子-如何用python删除指定文件夹里面的所有文件
- 如何用Procexp和Autoruns识别并删除木马
- 如何用javascript控制checkbox,并进行批量删除
- Awesome Duplicate Photo Finder-寻找并删除重复图片
- python删除重复文件代码
- 如何用DOS命令删除N天以前的文件?
- 12.如何用终端删除.svn控制版本文件
- 如何用 tmpwatch 删除某个目录下的特定文件
- 如何用easyrecovery恢复已删除的文件
- 问如何用文件
- opencv如何用模板匹配寻找目标
- 使用python读取txt文件的内容,并删除重复的行数
- 如何用python读取和写入TIFF文件1
- 如何用python读取和写入TIFF文件2
- python如何用pyinstalle打包成exe文件
- 如何利用批处理文件获取前一天的日期
- ListView setAdapter注意事项
- 如何用Python实现目录遍历
- Python碎碎念
- jquery的选择器使用实例
- 如何用Python寻找重复文件并删除
- Oracle 11gR2静默安装 & 命令行安装
- ORA-32004
- 如何用Python输出PPT中的文字信息
- 关于orapwd命令entries参数的探究
- 如何利用Direct NFS克隆数据库
- zookeeper(一) --- zookeeper概述
- RAC碎碎念
- Oracle之DBMS_RANDOM包详解