1

我是新手Python,但我爱上了这门语言!

我有一个巨大的数据库,sqlite3其中包含文件路径row 0MD5.row 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

您可以放入cur一个循环,仅检索您实际使用的列,并在循环中使用元组解包,如下所示:

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

    for row1, row3 in cur:
        print [[row3],[row1]]

另外,为什么不使用DISTINCT

cur.execute("SELECT DISTINCT row1, row3 FROM IMAGES")
于 2013-09-12T12:36:26.700 回答
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 回答
1

如果要按 MD5 组合,则首先要使列表按 MD5 排序。在您的情况下,这最好留给 sqlite,因此您应该在查询中添加一个 order by(参见例如https://mariadb.com/kb/en/order-by-clause/)。之后,您应该遍历所有行并执行以下操作:

if currentMD5 != previousMD5:
  dictionary[currentMD5] = [currentFilePath]
else:
  dictionary[currentMD5].append(currentFilePath]
currentMD5 = previousMD5
于 2013-09-12T12:36:23.380 回答