日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python高效率遍历文件夹寻找重复文件

發(fā)布時(shí)間:2025/3/20 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python高效率遍历文件夹寻找重复文件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

為什么要寫這篇文章呢。。。主要還是業(yè)務(wù)中有個(gè)需求,遍歷一個(gè)將近200w數(shù)據(jù)的文件夾,大部分還都是視頻文件那種,但是這玩意用的次數(shù)還不多,做文件夾index也不是很ok,所以寫了一個(gè)腳本來處理這個(gè)問題,從而發(fā)現(xiàn)了自己的一些薄弱點(diǎn),將其記錄下來,方便自己,也方便未來其他的兄弟使用

基本需求

  • 把文件夾中的重復(fù)文件找出來
  • 找出來之后用csv輸出,左邊是源文件,右邊是重復(fù)文件
  • 效率不能差,不能直接撐爆內(nèi)存,不能占用過多資源
  • 檢測(cè)的文件夾和存放csv的地方可以自己定義,加上終端交互
  • 重復(fù)文件篩選支持md5,大小等方式
  • 需求分析

    首先要分析一點(diǎn),就是我們?cè)撊绾稳プ鲋貜?fù)文件的對(duì)比,并且效率還要高,首先網(wǎng)上過多的遞歸,os.walk的方法不可用,因?yàn)樗麄兌紩?huì)把遍歷到的內(nèi)容直接做成一個(gè)大列表,塞到內(nèi)存里面,數(shù)據(jù)量大很容易爆掉,并且還要進(jìn)行MD5,或者是大小比對(duì),這個(gè)就非常難纏了。

    基礎(chǔ)想法

    其實(shí)說白了,拿到所有文件列表file_list,把文件依次對(duì)比,這里我們可以用dict,分兩種情況

    按照文件名和大小

    設(shè)定兩個(gè)dict,例如record和dup,遍歷file_list,生成一個(gè)數(shù)組,比對(duì)其中的文件名和大小

    按照大小和MD5值

    設(shè)定兩個(gè)dict,例如record和dup,遍歷file_list,生成一個(gè)數(shù)組,比對(duì)其中的md5值和大小

    具體代碼

    閑話休提,我們開始寫代碼吧

    定義遍歷函數(shù)代碼

    首先定義遍歷文件夾的部分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# 這里用了一個(gè)迭代器邏輯,防止所有數(shù)據(jù)塞內(nèi)存爆掉path_collection = (os.path.join(root,fn) for root,dirs,files in os.walk(path) for fn in files)return path_collection

    定義檢查md5值代碼

    接著我們定義檢查md5值的一個(gè)邏輯checksum.py

    ''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和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

    定義主函數(shù)代碼

    # 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:# 這里使用了大小,文件名的對(duì)比方式,如果你需要MD5值的對(duì)比方式,可以打開下面的注釋#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"參數(shù)不是一個(gè)有效的文件夾!"exit()else:path = path.decode("utf-8")print u"待檢測(cè)的文件夾為{path}".format(path=path)with open(u"{csv_path}重復(fù)文件.csv".format(csv_path=csv_path),"w+") as csvfile:# 源文件 重復(fù)文件header = ["Source", "Duplicate"]writer = csv.DictWriter(csvfile, fieldnames=header)writer.writeheader()print u"開始遍歷文件夾,尋找重復(fù)文件,請(qǐng)等待........."print u"開始寫入CSV文件,請(qǐng)等待........"for file in findDupes(path).items():writer.writerow({"Source":file[1],"Duplicate":file[0]})

    結(jié)語

    實(shí)現(xiàn)了哪些功能呢,哈哈,結(jié)尾來說一下,其實(shí)核心就是我用了一個(gè)列表生成器,加了一個(gè)迭代器,迭代器可是好東西,不會(huì)撐內(nèi)存,不錯(cuò)了,效率也還可以,200w數(shù)據(jù)判定也就20多分鐘,支持大數(shù)據(jù)量

    總結(jié)

    以上是生活随笔為你收集整理的Python高效率遍历文件夹寻找重复文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。