前言

为什么要写这篇文章呢。。。主要还是业务中有个需求,遍历一个将近200w数据的文件夹,大部分还都是视频文件那种,但是这玩意用的次数还不多,做文件夹index也不是很ok,所以写了一个脚本来处理这个问题,从而发现了自己的一些薄弱点,将其记录下来,方便自己,也方便未来其他的兄弟使用

基本需求

  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,sysclass diskwalk(object):def __init__(self, path):self.path = pathdef 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: breakchecksum.update(buffer)fp.close()checksum = checksum.digest()return checksum

定义主函数代码

# 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]=fileexcept:continuereturn dupif __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多分钟,支持大数据量

Python高效率遍历文件夹寻找重复文件相关推荐

  1. Win10中使用CMD命令遍历文件夹删除重复文件

    接上一篇<Win10中使用CMD命令遍历文件夹去除多余后缀名>,当修改完后缀名的时候发现,有些文件下载了两次,比如说同时存在video.mp4和video(1).mp4这两个文件,随便点开 ...

  2. 命令行批量删除文件夹中重复文件

    批量删除文件夹中的重复文件 当进行批量下载时,遇到了下面这种情况: 文件(1).docx 文件(2).docx 文件.docx 尤其是当文件夹下又有子文件夹面临同样的问题时,更加头疼了.如果去逐个删除 ...

  3. python批量删除文件1001python批量删除文件_Python实现递归遍历文件夹并删除文件...

    思路: 遍历文件夹下面的文件夹 如果文件夹名称等于".svn",则修改文件夹的属性(因为".svn"的文件都是只读的,你不能直接删除) 删除此文件夹 如果文件夹 ...

  4. python递归遍历目录_Python实现递归遍历文件夹并删除文件

    思路: 遍历文件夹下面的文件夹 如果文件夹名称等于".svn",则修改文件夹的属性(因为".svn"的文件都是只读的,你不能直接删除) 删除此文件夹 如果文件夹 ...

  5. python 判断文件夹是否存在 否则创建_10行Python代码自动清理电脑内重复文件,解放双手!...

    大家好,又到了Python办公自动化系列. 今天分享一个系统层面的自动化案例: 「给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除」 主要涉及的知识点有: os模块综合应 ...

  6. python根据文件名或后缀名遍历文件夹下所有文件或图片的路径,并计算文件行数

    python遍历文件夹下所有文件或图片的路径 代码 指定目录下的指定后缀文件 import glob #获取指定目录下的所有图片 print (glob.glob("\\home\\qiao ...

  7. python 打开文件夹所有文件_python遍历文件夹下所有文件

    python遍历文件夹下所有文件的方法:首先打开相应的代码文件:然后通过"for f in files:print(os.path.join(root, f))"方式遍历所有的文件 ...

  8. python遍历读取文件夹下所有文件内容_python遍历文件夹下所有文件

    python遍历文件夹下所有文件的方法:首先打开相应的代码文件:然后通过"for f in files:print(os.path.join(root, f))"方式遍历所有的文件 ...

  9. 用python重复下载文件_python删除本地夹里重复文件的方法

    上次的博文主要说了从网上下载图片,于是我把整个笑话网站的图片都拔下来了,但是在拔取的图片中有很多重复的,比如说页面的其他图片.重复发布的图片等等.所以我又找了python的一些方法,写了一个脚本可以删 ...

最新文章

  1. oracle linux 5.8安装oracle 11g rac环境之grid安装
  2. 单元测试:使用mocha和should.js搭建nodejs的单元测试
  3. linux无法创建符号链接 权限不够_Linux 基本命令(看完就会系列)
  4. 为什么说「中台」程序员将来会最值钱?
  5. 基因组中的趣事(二)- 最长的基因2.7 million,最短的基因只有8 nt却能编码
  6. Eclipse下Maven工程多模块继承和聚合的创建
  7. 经典算法(61~90)
  8. 解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题
  9. css点滴3—5种方式实现圆环
  10. RSA 2019|远禾科技携YScanner荣获国际权威杂志认可
  11. java textview多行_如何在java android中将ellipsize设置为textview的两行或多行
  12. 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)...
  13. linux系统安装文网卫士,360主机卫士 linux版的安装/使用/卸载 方法
  14. 计算以2为底的log
  15. 实现链栈各种基本运算的算法
  16. ECharts实例(4)
  17. 如何把握个股分时图的走势,在盘中捕捉涨停板?
  18. Nginx location相关配置说明
  19. 在Linux下给物联网卡设置APN
  20. 高考水平科测试软件,免费 高中选课选科综合测评 - 在线工具网 - 工作生活好帮手...

热门文章

  1. tensorflow 1.0 学习:模型的保存与恢复(Saver)
  2. 全新的 flow.ci Dashboard 上线
  3. 各种排序算法及其java程序实现
  4. 隐马尔科夫模型(Hidden Markov Models) 系列之五
  5. selenium search
  6. 发现一个问题,可能是Sql Express 2005的Bug
  7. SQL 2005 Oct CTP 和VS2005 for CTP安装的情况
  8. 【温故知新】CSS学习笔记(显示模式简介)
  9. LSMW批处理使用方法(02)_步骤1
  10. ALEIDoc EDI(4)--change point02