教你用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 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_collection
if __name__ == '__main__':
        for file in diskwalk(sys.argv[1]).paths():
                print file

2.chechsum.py

import hashlib,sys
def 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 checksum
if __name__ == '__main__':
        create_checksum(sys.argv[1])

3. find_dupes.py

from checksum import create_checksum
from diskwalk import diskwalk
from os.path import getsize
import sys
def 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 dup

if __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,sys
class 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
        return
if __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函数是交互模式,让用户来确定是否删除。这充分了考虑了客户的需求。

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

最后,贴个完整版本的,兼容Python 2.0, 3.0。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from __future__ import print_function
import os, sys, hashlib
class diskwalk(object):
    def __init__(self, path):
        self.path = path
    def paths(self):
        path = self.path
        files_in_path = []
        for dirpath, dirnames, filenames in os.walk(path):
            for each_file in filenames:
                fullpath = os.path.join(dirpath, each_file)
                files_in_path.append(fullpath)
        return files_in_path
def create_checksum(path):
    fp = open(path,'rb')
    checksum = hashlib.md5()
    while True:
        buffer = fp.read(8192)
        if not buffer: break
        checksum.update(buffer)
    fp.close()
    checksum = checksum.digest()
    return checksum
def findDupes(path):
    record = {}
    dup = {}
    d = diskwalk(path)
    files = d.paths()
    for each_file in files:
        compound_key = (os.path.getsize(each_file), create_checksum(each_file))
        if compound_key in record:
            dup[each_file] = record[compound_key]
        else:
            record[compound_key] = each_file
    return dup
class deletefile(object):
    def __init__(self, file_name):
        self.file_name = file_name
    def delete(self):
        print("Deleting %s" % self.file_name)
        os.remove(self.file_name)
    def dryrun(self):
        print("Dry Run: %s [NOT DELETED]" % self.file_name)
    def interactive(self):
        try:
            answer = raw_input("Do you really want to delete: %s [Y/N]" % self.file_name)
        except NameError:
            answer = input("Do you really want to delete: %s [Y/N]" % self.file_name)
        if answer.upper() == 'Y':
            os.remove(self.file_name)
        else:
            print("Skiping: %s" % self.file_name)
        return
def main():
    directory_to_check = sys.argv[1]
    duplicate_file = findDupes(directory_to_check)
    for each_file in duplicate_file:
        delete = deletefile(each_file)
        delete.interactive()
if __name__ == '__main__':
    main()

其中,第一个参数是待检测的目录。

到此这篇关于如何用Python寻找重复文件并删除的文章就介绍到这了,更多相关Python删除重复文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python删除本地夹里重复文件的方法

    上次的博文主要说了从网上下载图片,于是我把整个笑话网站的图片都拔下来了,但是在拔取的图片中有很多重复的,比如说页面的其他图片.重复发布的图片等等.所以我又找了python的一些方法,写了一个脚本可以删除指定文件夹里重复的图片. 一.方法和思路 1.比对文件是否相同的方法:hashlib库里提供了获取文件md5值的方法,所以我们可以通过md5值来判定是否图片相同 2.对文件的操作:os库里有对文件的操作方法,比如:os.remove()可以删除指定的文件, os.listdir()可以通过指定文件

  • Python实现的删除重复文件或图片功能示例【去重】

    本文实例讲述了Python实现的删除重复文件或图片功能.分享给大家供大家参考,具体如下: 通过python爬虫或其他方式保存的图片文件通常包含一些重复的图片或文件, 通过下面的python代码可以将重复的文件删除以达到去重的目的.其中,文件目录结构如下图: # /usr/bin/env python # -*- coding:utf-8 -*- # 运行的代码文件要放到删除重复的文件或图片所包含的目录中 import os import hashlib def filecount(): file

  • 教你用Python寻找重复文件并删除的脚本写法

    在实际生活中,经常会有文件重复的困扰,即同一个文件可能既在A目录中,又在B目录中,更可恶的是,即便是同一个文件,文件名可能还不一样.在文件较少的情况下,该类情况还比较容易处理,最不济就是one by one的人工比较——即便如此,也很难保证你的眼神足够犀利.倘若文件很多,这岂不是个impossible mission?最近在看<Python UNIX和Linux系统管理指南>,里面就有有关“数据比较”的内容,在其基础上,结合实际整理如下. 该脚本主要包括以下模块:diskwalk,chechs

  • 教你用Python读取CSV文件的5种方式

    目录 第一招:简单的读取 第二招:用nametuple 第三招:用tuple类型转换 第四招:用DictReader 第五招:用字典转换 典型的数据集stocks.csv: 一个股票的数据集,其实就是常见的表格数据.有股票代码,价格,日期,时间,价格变动和成交量.这个数据集其实就是一个表格数据,有自己的头部和身体. 第一招:简单的读取 我们先来看一种简单读取方法,先用csv.reader()函数读取文件的句柄f生成一个csv的句柄,其实就是一个迭代器,我们看一下这个reader的源码: 喂给re

  • 教你用python提取txt文件中的特定信息并写入Excel

    目录 问题描述: 工具: 操作: 源代码: Reference: 总结 问题描述: 我有一个这样的数据集叫test_result_test.txt,大概几百上千行,两行数据之间隔一个空行. N:505904X:0.969wsecY:0.694wsec N:506038X:4.246wsecY:0.884wsec N:450997X:8.472wsecY:0.615wsec ... 现在我希望能提取每一行X:和Y:后面的数字,然后保存进Excel做进一步的数据处理和分析 就拿第一行来说,我只需要0

  • python查找重复图片并删除(图片去重)

    本文实例为大家分享了python查找重复图片并删除的具体代码,供大家参考,具体内容如下 和网络爬虫配套的,也可单独使用,从网上爬下来的图片重复太多,代码支持识别不同尺寸大小一致的图片,并把重复的图片删除,只保留第一份. # -*- coding: utf-8 -*- import cv2 import numpy as np import os,sys,types def cmpandremove2(path): dirs = os.listdir(path) dirs.sort() if le

  • 一篇文章教你用Python实现一键文件重命名

    目录 应用背景 准备工作 上脚本 view.py 功能展示 打包方式 windows打包方式:pycharm打包为exe执行文件方法 总结 应用背景 背景:"由于工作需要可能需要对一些文件进行重命名的处理,但是可能操作起来比较烦,点错了就命名失败或者没带鼠标,用控制板操作起来比较麻烦等等场景" ps:以上都是200自我觉得比较烦,所以才出了这个小功能- 好了,此版本是基于上次文章的版本进行更新,(❕这次对上次的代码进行了更新,下文不会进行补充了哦,详细可以查看github上的源代码)详

  • 基于Python实现大文件分割和命名脚本过程解析

    日志文件分割.命名 工作中经常会收到测试同学.客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针对时间点,因此最好对分割后的日志文件使用文件中日志的开始.结束时间点来命名,这样使用起来最为直观,下面给大家分享两个脚本,分别作分割.命名,希望能够给大家提供一点点帮助: 大文件分割 用法: python split_big_file.py 输入文件全路径名 输入期望的分割后每个小文件的行数 Jus

  • python实现自动清理重复文件

    前言 大家好,又到了Python办公自动化系列. 今天分享一个系统层面的自动化案例: 「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」 主要涉及的知识点有: os模块综合应用 glob模块综合应用 利用filecmp模块比较两个文件 步骤分析 该程序实现的逻辑可以具化为: 遍历获取给定文件夹下的所有文件,然后通过嵌套循环两两比较文件是否相同,如果相同则删除后者. 实现问题的关键就变成了? 如何判断两个文件是否相同? 在这里我们可以使用filecmp模块,来看看官

  • 利用Python删除电脑中重复文件的方法

    目录 前言 练习 代码演示 总结 前言 在生活中,我们经常会遇到电脑中文件重复的情况.在文件较少的情况下,这类情况还比较容易处理,最不济就是一个个手动对比删除:而在重复文件很多的时候,我们很难保证把重复文件全部删完.下面文章就来简单介绍便捷一个小方法,用Python来删除重复文件 练习 Python提供一个内置电脑文件管理库os模块,我们可以利用它来删除多余文件. 当一个文档里存在重复文件名,我们的系统会自动给我们重复的文件名更名, 比如下图的文件“1”重复了3次:  那我们该怎么删除文件“1”

  • Python自动化办公之清理重复文件详解

    目录 清理重复的文件 清理重复文件的优化 清理重复的文件 已知条件: 什么都不知道,只需要知道它是文件就可以了 实现方法: 可以从指定路径(或最上层路径)开始读取,利用 glob 读取每个文件夹,读到文件,记录名称和大小,每一次检测之前是否读取过相同名称的文件,如果存在,判断大小是否相同,如果相同,我们就认为这是重复文件,将其删除. 代码示例如下: # coding:utf-8 import glob import os.path data = {} # 定义一个空的字典,暂时将文件名存进来 d

  • Python实现清理重复文件功能的示例代码

    目录 前置 查找.删除重复文件 GUI制作 GUI界面设计 逻辑设计 效果展示 在电脑上或多或少的存在一些重复文件,体积小的倒没什么,如果体积大的就很占内存了,而如果自己一个一个查看文件是否重复,然后再删除,还是很要命的. 为此,我用python制作了一个删除重复文件的小工具,核心代码很简单,就十行代码,不管什么类型的文件都可以一键删除! 前置 PySimpleGUI库用来创建可视化界面,os操作文件,只需要这两个库: import os import PySimpleGUI as sg os为

随机推荐