使用Python检测重复文件

3
我将为您翻译以下内容:

我正在尝试编写一个Python脚本,用于整理文件(照片、视频),检查每个文件的元数据,找到并移动所有重复文件到另一个目录。但是在检查元数据的部分遇到了困难。尝试使用os.stat - 对于重复的文件不返回True。理想情况下,我应该能够做如下操作:

if os.stat("original.jpg")== os.stat("duplicate.jpg"):  
    shutil.copy("duplicate.jpg","C:\\Duplicate Folder") 

指针有人需要吗?

1
使用hashlib足够了吗? - El Bert
1
检查每个的元数据。对于您来说,“重复项”到底是什么?相同的内容?还是相同的内容和元数据(哪些元数据)? - Sylvain Leroux
重复文件是指具有相同内容的文件,因此我认为它们也应该具有相同的元数据(在所有字段中)。但我可能是错的。我的操作系统是Windows 7 Home Basic。 - La Alquimista
1
查看标准库中的 filecmp 模块。它应该可以满足你的需求。 - Blckknght
4个回答

2

有几件事情你可以做。你可以比较每个文件的内容或哈希值,也可以检查os.stat结果中的一些选择性属性,例如:

def is_duplicate(file1, file2):
    stat1, stat2 = os.stat(file1), os.stat(file2)
    return stat1.st_size==stat2.st_size and stat1.st_mtime==stat2.st_mtime

2

使用 set 来跟踪已经遇到的文件的基本循环:

import glob
import hashlib

uniq = set()
for fname in glob.glob('*.txt'):
    with open(fname,"rb") as f:
        sig = hashlib.sha256(f.read()).digest()
        if sig not in uniq:
            uniq.add(sig)
            print fname
        else:
            print fname, " (duplicate)"

请注意,与任何哈希函数一样,存在两个不同的文件具有相同摘要的轻微可能性,即碰撞。根据您的需求,这是可以接受的或不可接受的。
根据Thomas Pornin在另一个答案中的说法:

"例如,对于SHA-256(n = 256)和十亿个消息(p = 10 9 ),那么发生碰撞的概率约为4.3 * 10 -60 。"


根据您的需求,如果您必须检查其他属性以识别“真正的”重复项,请将sig = ....行更改为适合您的内容。例如,如果您需要检查“相同内容”和“相同所有者”(由os.stat()返回的st_uid),请编写:
    sig = ( hashlib.sha256(f.read()).digest(), 
            os.stat(fname).st_uid )

0
如果两个文件的 md5 值相同,则它们是完全相同的副本。
from hashlib import md5
with open(file1, "r") as original:
    original_md5 = md5(original.read()).hexdigest()
    with open(file2, "r") as duplicate:
       duplicate_md5 = md5(duplicate.read()).hexdigest()
       if original_md5 == duplicate_md5:
          do_stuff()

在你的例子中,你正在使用 jpg 文件,这种情况下你想要调用方法 open 并将其第二个参数设置为 rb。请参阅 open 的文档以了解更多信息。

如果两个文件具有相同的 md5,它们就是完全重复的。这是明显错误的。(http://th.informatik.uni-mannheim.de/people/lucks/HashCollisions/) - icktoofay

0

os.stat提供了一些文件元数据和特性的信息,包括创建时间。但这并不是找出两个文件是否相同的好方法。

例如:两个文件可能相同,但创建时间不同。因此,在比较统计信息时会失败。 Sylvain Leroux的方法是在性能和准确性方面最佳的选择,因为很少有两个不同的文件具有相同的哈希值。

因此,除非您有大量数据且重复的文件会导致系统崩溃,否则这是最好的选择。

如果这是您的情况(似乎不是),那么唯一确定两个文件是否相同的方法是逐字节迭代并进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接