使用Python检测重复文件

时间:2014-09-01 14:30:27

标签: python

我正在尝试用Python编写一个脚本来分类文件(照片,视频),检查每个文件的元数据,查找并将所有重复项移动到一个单独的目录中。陷入了元数据检查部分。尝试过os.stat - 对于重复文件不返回True。理想情况下,我应该能够做到这样的事情:

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

指点任何人?

4 个答案:

答案 0 :(得分:1)

你可以做一些事情。您可以比较每个文件的内容或哈希值,或者您可以从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

答案 1 :(得分:1)

使用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)"

请注意,与任何哈希函数一样,collision的可能性很小。这是具有相同摘要的两个不同文件。根据您的需要,这是可以接受的。

根据Thomas Pornin in an other answer

  

“例如,使用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 )

答案 2 :(得分: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

的文档

答案 3 :(得分:0)

os.stat提供有关某些文件的元数据和功能的信息,包括创建时间。这不是一个好方法,以确定两个文件是否相同。

例如:两个文件可以相同并且创建时间不同。因此,比较统计数据将失败。结合性能和准确性时, Sylvain Leroux 方法是最好的方法,因为很少有两个不同的文件具有相同的哈希值。

因此,除非您拥有数量惊人的数据并且重复文件会导致系统死亡,否则这就是您的选择。

如果是你的情况(似乎不是),那么......你可以100%确定两个文件相同的唯一方法是迭代并执行每个字节的比较字节。