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

最初に作成するオブジェクトは1つ md5だけで、すべてのファイルに同じハッシュオブジェクトを再利用します。これにより、これまでに見たすべてのファイルの実行中のハッシュが作成されるため、計算された値がファイルごとに異なることは驚くべきことではありません。

md5代わりに、ファイルごとに新しいオブジェクトを作成します。

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

md5()または、もっと簡潔に言えば、データをコンストラクターに直接渡すことができます。

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