比较python中多个jpegs的源代码

时间:2012-09-11 23:09:58

标签: python

我有一个包含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()

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

hash = md5(src).digest()