前言
基本需求
需求分析
首先要分析一點,就是我們該如何去做重複檔案的對比,並且效率還要高,首先網上過多的遞迴,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...