精华内容
下载资源
问答
  • 首先要分析一点,就是我们该如何去做重复文件的对比,并且效率还要高,首先网上过多递归,os.walk方法不可用,因为他们都会把遍历到内容直接做成一个大列表,塞到内存里面,数据量大很容易爆掉,并且还要进行...

    基本需求

    1. 把文件夹中的重复文件找出来
    2. 找出来之后用csv输出,左边是源文件,右边是重复文件
    3. 效率不能差,不能直接撑爆内存,不能占用过多资源
    4. 检测的文件夹和存放csv的地方可以自己定义,加上终端交互
    5. 重复文件筛选支持md5,大小等方式

    需求分析

    首先要分析一点,就是我们该如何去做重复文件的对比,并且效率还要高,首先网上过多的递归,os.walk的方法不可用,因为他们都会把遍历到的内容直接做成一个大列表,塞到内存里面,数据量大很容易爆掉,并且还要进行MD5,或者是大小比对,这个就非常难缠了。

    基础想法

    其实说白了,拿到所有文件列表file_list,把文件依次对比,这里我们可以用dict,分两种情况
    按照文件名和大小

    设定两个dict,例如record和dup,遍历file_list,生成一个数组,比对其中的文件名和大小
    按照大小和MD5值

    设定两个dict,例如record和dup,遍历file_list,生成一个数组,比对其中的md5值和大小

    具体代码

    闲话休提,我们开始写代码吧

    定义遍历函数代码

    首先定义遍历文件夹的部分diskwalk.py

    # coding: utf-8
    
    __author__ = "lau.wenbo"
    
    
    import os,sys
    
    
    class diskwalk(object):
        def __init__(self, path):
            self.path = path
        def paths(self):
            path = self.path
            # 这里用了一个迭代器逻辑,防止所有数据塞内存爆掉
            path_collection = (os.path.join(root,fn) for root,dirs,files in os.walk(path) for fn in files)
            return path_collection
    

    定义检查md5值代码

    接着我们定义检查md5值的一个逻辑checksum.py

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    # coding: utf-8
    
    __author__ = "lau.wenbo"
    
    import hashlib,sys
    
    # 分块读MD,速度快
    
    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
    

    定义主函数代码

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    # coding: utf-8
    
    __author__ = "lau.wenbo"
    
    
    from checksum import create_checksum
    from diskwalk import diskwalk
    from os.path import getsize
    import csv
    import os
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    
    
    def findDupes(path):
        record = {}
        dup = {}
        d = diskwalk(path)
        files = d.paths()
        for file in files:
            try:
                # 这里使用了大小,文件名的对比方式,如果你需要MD5值的对比方式,可以打开下面的注释
                #compound_key = (getsize(file),create_checksum(file))
                compound_key = (getsize(file), file.split("/")[-1])
                if compound_key in record:
                    dup[file] = record[compound_key]
                else:
                    record[compound_key]=file
            except:
                continue
        return dup
    
    
    if __name__ == '__main__':
        path = sys.argv[1]
        csv_path = sys.argv[2]
        if not os.path.isdir(path) or not os.path.isdir(csv_path) or csv_path[-1] != "/":
            print u"参数不是一个有效的文件夹!"
            exit()
        else:
            path = path.decode("utf-8")
            print u"待检测的文件夹为{path}".format(path=path)
            with open(u"{csv_path}重复文件.csv".format(csv_path=csv_path),"w+") as csvfile:
                # 源文件 重复文件
                header = ["Source", "Duplicate"]
                writer = csv.DictWriter(csvfile, fieldnames=header)
                writer.writeheader()
                print u"开始遍历文件夹,寻找重复文件,请等待........."
                print u"开始写入CSV文件,请等待........"
                for file in findDupes(path).items():
                    writer.writerow({"Source":file[1],"Duplicate":file[0]})
    

    结语

    实现了哪些功能呢,哈哈,结尾来说一下,其实核心就是我用了一个列表生成器,加了一个迭代器,迭代器可是好东西,不会撑内存,不错了,效率也还可以,200w数据判定也就20多分钟,支持大数据量

    展开全文
  • 实例186 移动正在使用的文件 268 实例187 批量复制文件 269 6.6 指定类型的文件操作 270 实例188 文本文件的操作 270 实例189 简单的文件加密解密 271 6.7 其他 273 实例190 获取窗口文本 273 实例191...
  •  通过提示及配置文件等来控制执行计划;  在程序中优化查询而无需改动代码。  作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行方向,赋予了他们不断开拓动力。 作者简介  KAREN MORTON 研究...
  • 实例184 移动正在使用的文件 236 实例185 批量复制文件 237 实例186 文件复制过程中显示进度条 238 5.6 指定类型的文件操作 239 实例187 对INI文件进行操作 239 实例188 文本文件的操作 241 实例189 在...
  •  通过提示及配置文件等来控制执行计划;  在程序中优化查询而无需改动代码。  作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行方向,赋予了他们不断开拓动力。 作者简介  KAREN MORTON 研究...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 ...
  • 实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061...
  • 实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061...
  • MAPGIS地质制图工具

    2013-05-06 16:15:30
    2、然后用section打开你要粘贴的文件或者工程,点菜单,辅助工具1->超级粘贴。任意点击就拷贝到该处,或者还可以选择基准点改变位置,这里的基准点和超级复制的基准点对应。 Excel与MapGis数据互通 注意问题: 1、...
  • Visual Studio程序员箴言--详细书签版

    热门讨论 2012-10-16 20:37:39
    技巧2.28 在“书签”窗口中,如何在书签文件夹之间导航 46 技巧2.29 为快速查找所有结果创建书签 46 2.4 IntelliSense 47 语句完成、参数信息和完成单词 47 技巧2.30 使用Ctrl+J键调用语句完成 48 技巧...
  • 实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061 设置...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061 ...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061 ...
  • 实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061 ...
  • 实例057 在RichTextBox控件中显示RTF格式的文件 66 实例058 为RichTextBox控件添加自定义滚动条 68 实例059 在RichTextBox控件中实现关键字描红 69 实例060 在RichTextBox控件中实现项目编号功能 71 实例061 ...
  • 它使物理网络拓朴和协议透明化,这样网络上用户可以访问任何资源,而不需要知道资源在什么地方,或物理上它是如何连接到网络上。% t! G+ S" E# e9 q 2 \% m) N4 I- I* v4 f. t(2)集中式管理: * [. Y& e' Q6 @,...
  • C#.net_经典编程例子400个

    热门讨论 2013-05-17 09:25:30
    267 6.5 复制文件 268 实例186 移动正在使用的文件 268 实例187 批量复制文件 269 6.6 指定类型的文件操作 270 实例188 文本文件的操作 270 实例189 简单的文件加密解密 271 6.7 ...
  • 02 创建用户相关的文件 03 用户增删该查及组相关操作 04 对文件的权限管理 05 对目录的权限管理 06 权限管理补充 07 属主属组及基于数字的权限管理 第5章 01 上节课复习 02 文件合并与文件归档 03 文件归档与两种...
  • C#程序开发范例宝典

    2010-12-15 20:05:16
    实例153 播放指定avi-mid-wav文件...... 226 实例154 获取多媒体详细信息列表...... 227 5.2 MP3、WAV播放...... 228 实例155 带记忆功能MP3播放器...... 228 实例156 自动播放MP3播放器...... 231 ...
  • 经典SQL语句大全

    热门讨论 2014-12-20 12:00:30
    3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 add...
  • 3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 ...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

如何筛选文件夹里重复的文件