我有一个包含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()
但是这仍然会返回每个文件!
我可能做错了但我不知道是什么:(
答案 0 :(得分:3)
您在开头只创建一个 md5
对象,并为每个文件重用相同的哈希对象。这会创建所有到目前为止所见的文件的运行哈希值,因此每个文件的计算值都不同也就不足为奇了。
相反,为每个文件创建一个新的md5
对象:
m = md5()
m.update(src)
hash = m.digest()
或者更简洁地说,您可以将数据直接传递给md5()
构造函数:
hash = md5(src).digest()