2014-09-01 40 views
1

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

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

指向任何人?

+1

使用[hashlib](https://docs.python.org/3/library/hashlib.html)就足够了吗? – bvidal 2014-09-01 14:36:09

+1

_“检查每个元数据”_什么是你的“重复”?相同的内容?或相同的内容和相同的元数据(哪些?) – 2014-09-01 14:39:50

+0

什么是你的操作系统? – Kasramvd 2014-09-01 14:46:03

回答

0

你可以做几件事。您可以比较每个文件的内容或哈希或者您可以检查从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 
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。对于使用set保持已经遇到文件跟踪查看open

+0

“如果两个文件具有相同的'md5',则它们是完全相同的。”[显然是错误的。](http://th.informatik.uni-mannheim.de/people/lucks/HashCollisions/) – icktoofay 2014-09-02 00:13:39

1

基本循环的文档:

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),则概率[碰撞]约为4.3 * 10 -60。“


鉴于你的需要,如果你有为了识别“真”的重复,改变sig = ....行任何适合你检查的附加属性。例如,如果您需要检查“相同的内容”,并(通过os.stat()返回st_uid)“相同的所有者”,写:

sig = (hashlib.sha256(f.read()).digest(), 
      os.stat(fname).st_uid) 
0

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

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

因此,除非您有非常多的数据,并且重复的文件会导致系统死机,否则这是要走的路。

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