如何用Python寻找重复文件并删除

在实际生活中,经常会有文件重复的困扰,即同一个文件可能既在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,sys
class diskwalkobject):
        def __init__self,path):
                self.path = path
        def pathsself):
                path=self.path
                path_collection=[]
                for dirpath,dirnames,filenames in os.walkpath):
                        for file in filenames:
                                fullpath=os.path.joindirpath,file)
                                path_collection.appendfullpath)
                return path_collection
if __name__ == '__main__':
        for file in diskwalksys.argv[1]).paths):
                print file

2. chechsum.py

import hashlib,sys
def create_checksumpath):
    fp = openpath)
    checksum = hashlib.md5)
    while True:
        buffer = fp.read8192)
        if not buffer:break
        checksum.updatebuffer)
    fp.close)    
    checksum = checksum.digest)
    return checksum
if __name__ == '__main__':
        create_checksumsys.argv[1])

3. find_dupes.py

from checksum import create_checksum
from diskwalk import diskwalk
from os.path import getsize
import sys
def findDupespath):
    record = {}
    dup = {}
    d = diskwalkpath)
    files = d.paths)
    for file in files:
        compound_key = getsizefile),create_checksumfile))
        if compound_key in record:
            dup[file] = record[compound_key]    
        else:
            record[compound_key]=file
    return dup

if __name__ == '__main__':
    for file in  findDupessys.argv[1]).items):
        print "The duplicate file is %s" % file[0]
        print "The original file is %s
" % file[1]
        

findDupes函数返回了字典dup,该字典的键是重复的文件,值是原文件。这样就解答了很多人的疑惑,毕竟,你怎么确保你输出的是重复的文件呢?

4. delete.py

import os,sys
class deletefileobject):
    def __init__self,file):
        self.file=file
    def deleteself):
        print "Deleting %s" % self.file
        os.removeself.file)
    def dryrunself):
        print "Dry Run: %s [NOT DELETED]" % self.file
    def interactiveself):
        answer=raw_input"Do you really want to delete: %s [Y/N]" % self.file)
        if answer.upper) == 'Y':
            os.removeself.file)
        else:
            print "Skiping: %s" % self.file
        return
if __name__ == '__main__':
    from find_dupes import findDupes
        dup=findDupessys.argv[1])
    for file in dup.iterkeys):
        delete=deletefilefile)
        #delete.dryrun)
          delete.interactive)
        #delete.delete)

deletefile类构造了3个函数,实现的都是文件删除功能、其中delete函数是直接删除文件,dryrun函数是试运行,文件并没有删除,interactive函数是交互模式,让用户来确定是否删除。这充分了考虑了客户的需求。

总结:这四个模块已封装好,均可单独使用实现各自的功能。组合起来就可批量删除重复文件,只需输入一个路径。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注