2014-09-01 77 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%確定兩個文件是相同的唯一方法是迭代和每個字節執行比較字節。