0

我有一个文件夹,里面有 78 张 jpeg 图片,其中只有 48 张是唯一的。我想用 Python 遍历这个文件夹中的文件,并让它打印出每个文件名的列表,只要图像不是重复的。

更具体地说,它将打印出一个数组,我可以将其复制并粘贴到 PHP 脚本中以供使用。

我的想法是,当我遍历文件时,将文件源的 md5 保存到一个数组中。但是,如果哈希值已经在数组中,它将忽略该文件并继续前进。

这是我的脚本:

from os import listdir
from os import path
from hashlib import md5

m = md5()
hashes = []
d = path.join("Z:\\mydir")
files = listdir(d);
i = 1;

print " array("

for file in files:

    src = "Z:\\mydir\\%s" % file
    src = open(src)
    src = src.read()

    m.update(src)
    hash = m.digest()

    if(hash not in hashes):

        hashes.append(hash)

        if(i == len(files)):
            print "\"%s\"" % file
        else:
            print "\"%s\"," % file
    i += 1

print ");"

这是打印出每张图片!

我认为这个问题可能是因为 jpeg 文件开头的元数据,所以我试图只阅读源代码的后半部分:

halfsrclen = len(src) / 2

m.update(src[halfsrclen:])
hash = m.digest()

但这仍然是返回每个文件!

我可能做错了什么,但我不知道是什么:(

4

1 回答 1

3

您在开始时只创建一个 md5对象,并为每个文件重用相同的哈希对象。这会为您迄今为止看到的所有文件创建一个运行哈希,因此每个文件的计算值不同也就不足为奇了。

相反,md5为每个文件创建一个新对象:

m = md5()
m.update(src)
hash = m.digest()

或者更简洁地说,您可以将数据直接传递给md5()构造函数:

hash = md5(src).digest()
于 2012-09-11T23:13:19.857 回答