1

这是我昨天的问题:通过hashlib查找重复文件?

我现在意识到我需要将文件分组为文件大小。假设我在一个文件夹中有 10 个文件,但其中 3 个文件每个 50 字节,我会将这 3 个文件分组。

我发现我可以使用以下方法找到文件的大小(以字节为单位):

print os.stat(/Users/simon/Desktop/file1.txt).st_size

或者:

print os.path.getsize(/Users/simon/Desktop/file1.txt)

这是伟大的。但是我将如何使用 os.walk 扫描文件夹并使用上述方法之一列出一组文件?

之后,我想通过 hashlib 的 MD5 对它们进行散列以查找重复项。

4

2 回答 2

3

按大小对文件名进行排序,然后用于itertools.groupby将大小相似的文件组合在一起。

import os
import os.path
import itertools

#creates dummy files with a given number of bytes.
def create_file(name, size):
    if os.path.isfile(name): return
    file = open(name, "w")
    file.write("X" * size)
    file.close()

#create some sample files 
create_file("foo.txt", 4)
create_file("bar.txt", 4)
create_file("baz.txt", 4)
create_file("qux.txt", 8)
create_file("lorem.txt", 8)
create_file("ipsum.txt", 16)

#get the filenames in this directory
filenames = [filename for filename in os.listdir(".") if os.path.isfile(filename)]

#sort by size
filenames.sort(key=lambda name: os.stat(name).st_size)

#group by size and iterate
for size, items_iterator in itertools.groupby(filenames, key=lambda name: os.stat(name).st_size):
    items = list(items_iterator)
    print "{} item(s) of size {}:".format(len(items), size)
    #insert hashlib code here, or whatever else you want to do
    for item in items:
        print item

结果:

3 item(s) of size 4:
bar.txt
baz.txt
foo.txt
2 item(s) of size 8:
lorem.txt
qux.txt
1 item(s) of size 16:
ipsum.txt
1 item(s) of size 968:
test.py
于 2013-09-11T20:10:11.527 回答
1

此示例代码允许您创建一个大小作为键的字典和一个大小作为值的文件列表。

#!/usr/bin/env python

import os,sys
d = {}
gen = os.walk(os.getcwd())

for i in gen:
    dirname, dirlist, filelist = i
    for f in filelist:
        fullname = os.path.join(dirname,f)
        sz = os.path.getsize(fullname)
        if d.has_key(sz):
            d[sz].append(fullname)

        else:
            d[sz] = []
            d[sz].append(fullname)




print d                        
于 2013-09-11T20:27:39.517 回答