我正在尝试用Python编写一个脚本来分类文件(照片,视频),检查每个文件的元数据,查找并将所有重复项移动到一个单独的目录中。陷入了元数据检查部分。尝试过os.stat - 对于重复文件不返回True。理想情况下,我应该能够做到这样的事情:
if os.stat("original.jpg")== os.stat("duplicate.jpg"):
shutil.copy("duplicate.jpg","C:\\Duplicate Folder")
指点任何人?
答案 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%确定两个文件相同的唯一方法是迭代并执行每个字节的比较字节。