1

私は に慣れてPythonいませんが、言語が大好きです!

sqlite3のファイルへのパスと のファイルを含む巨大なデータベースがありrow 0ます。MD5row 3

に基づいて重複ファイルを検索する必要があり、MD5次のようにこれらの重複を整理したいと思いdictionariesます。

{"b23e5d453643f66b68634d0204884cdf":an array of all paths that have the same MD5, like the one that is the key of this dictionary}

次のコードを使用してデータベースを検索し、tuples.

    db = sqlite3.connect('imges.db')
    with db:
        cur = db.cursor()    
        cur.execute("SELECT * FROM IMAGES")
    while True:
        row = cur.fetchone()
        if row == None:
            break
        self.duplesOfMD5 = [[row[3]],[row[0]]]
        print self.duplesOfMD5

それは私に次の出力を与えます:

[[u'b23e5d453643f66b68634d0204884cdf'], [u'/Volumes/Backup/images_to_test/File_one_copy.png']]
[[u'b23e5d453643f66b68634d0204884cdf'], [u'/Volumes/Backup/images_to_test/File_one.png']]
[[u'f0b4108172c50f243d9e0132df4703a0'], [u'/Volumes/Backup/images_to_test/File_with_no_duplicate.png']]

非常に適切で、パフォーマンスがひどい場合に私が試したすべての可能な解決策。これを行うための最良のPythonicの方法は何ですか?

ありがとうございました!

4

3 に答える 3

2

私があなたを正しく理解していれば、次のようなものが必要です。

{u'b23e5d453643f66b68634d0204884cdf':
     [u'/Volumes/Backup/images_to_test/File_one_copy.png', u'/Volumes/Backup/images_to_test/File_one.png'],
 u'f0b4108172c50f243d9e0132df4703a0':
     [u'/Volumes/Backup/images_to_test/File_with_no_duplicate.png']
}

これは、 defaultdictに最適です (Python 2.5 以降で使用可能)。

from collections import defaultdict

grouped_by_md5 = defaultdict(list)
db = sqlite3.connect('imges.db')
with db:
    cur = db.cursor()    
    cur.execute("SELECT row1, row3 FROM IMAGES")

    for row1, row3 in cur:
        grouped_by_md5[row3].append(row1)
于 2013-09-12T13:01:41.337 に答える