Python高效率遍歷資料夾尋找重複檔案

2021-10-18 18:44:14 字數 3223 閱讀 7406

前言

基本需求

需求分析

首先要分析一點,就是我們該如何去做重複檔案的對比,並且效率還要高,首先網上過多的遞迴,os.walk的方法不可用,因為他們都會把遍歷到的內容直接做成乙個大列表,塞到記憶體裡面,資料量大很容易爆掉,並且還要進行md5,或者是大小比對,這個就非常難纏了。

基礎想法

其實說白了,拿到所有檔案列表file_list,把檔案依次對比,這裡我們可以用dict,分兩種情況

具體**

閒話休提,我們開始寫**吧

首先定義遍歷資料夾的部分diskwalk.py

# coding: utf-8

__author__ =

"lau.wenbo"

import os,sys

class

diskwalk

(object):

def__init__

(self, path)

: self.path = path

defpaths

(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值的乙個邏輯checksum.py

'''

'''__author__ =

"lau.wenbo"

import hashlib,sys

# 分塊讀md,速度快

defcreate_checksum

(path)

: fp =

open

(path)

checksum = hashlib.md5(

)while

true

:buffer

= fp.read(

8192)if

notbuffer

:break

checksum.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]

=file

except

:continue

return dup

if __name__ ==

'__main__'

: path = sys.ar**[1]

csv_path = sys.ar**[2]

ifnot os.path.isdir(path)

ornot os.path.isdir(csv_path)

or csv_path[-1

]!="/":

print u"引數不是乙個有效的資料夾!"

exit(

)else

: path = path.decode(

"utf-8"

)print u"待檢測的資料夾為"

.format

(path=path)

with

open

(u"重複檔案.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檔案,請等待........"

forfile

in finddupes(path)

.items():

writer.writerow(

)

結語

實現了哪些功能呢,哈哈,結尾來說一下,其實核心就是我用了乙個列表生成器,加了乙個迭代器,迭代器可是好東西,不會撐記憶體,不錯了,效率也還可以,200w資料判定也就20多分鐘,支援大資料量

python 遍歷資料夾

在python中,檔案操作主要來自os模組,主要方法如下 os.listdir dirname 列出dirname下的目錄和檔案 os.getcwd 獲得當前工作目錄 os.curdir 返回當前目錄 os.chdir dirname 改變工作目錄到dirname os.path.isdir nam...

python 遍歷資料夾

1.遍歷資料夾 import os import os.path rootdir d data 指明被遍歷的資料夾 for parent,dirnames,filenames in os.walk rootdir 三個引數 分別返回1.父目錄 2.所有資料夾名字 不含路徑 3.所有檔案名字 for ...

python 遍歷資料夾

import os import os.path rootdir r d data 指明被遍歷的資料夾 for parent,dirnames,filenames in os.walk rootdir 三個引數 分別返回1.父目錄 2.所有資料夾名字 不含路徑 3.所有檔案名字 for dirnam...