在Python中检查文件是否相同的最优雅的方法是什么? 校验?字节比较?认为文件不会超过100-200 MB
答案 0 :(得分:9)
答案 1 :(得分:5)
使用hashlib获取每个文件的md5,并比较结果。
#! /bin/env python
import hashlib
def filemd5(filename, block_size=2**20):
f = open(filename)
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
f.close()
return md5.digest()
if __name__ == "__main__":
a = filemd5('/home/neo/todo')
b = filemd5('/home/neo/todo2')
print(a == b)
更新:从Python 2.1开始,有一个filecmp module可以满足您的需求,并且还有比较目录的方法。 我从来不知道这个模块,我自己还在学习Python: - )
>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst')
True
>>> filecmp.cmp('undoc.rst', 'index.rst')
False
答案 2 :(得分:4)
好的,这可能需要两个单独的答案。
如果要比较许多文件,请选择校验和并缓存每个文件的校验和。可以肯定的是,之后比较匹配的匹配文件。
如果您只有两个文件,请直接进行字节比较,因为您无论如何都必须读取文件来计算校验和。
在这两种情况下,请使用文件大小作为检查不平等的早期方法。
答案 3 :(得分:1)
在尝试任何其他解决方案之前,您可能希望对这两个文件执行os.path.getsize(...)
。
如果不同,则无需比较字节或计算校验和。
当然,这只有在文件大小没有修复时才有用。
示例:
def foo(f1, f2):
if not os.path.getsize(f1) == os.path.getsize(f2):
return False # Or similar
... # Checksumming / byte-comparing / whatever
答案 4 :(得分:-2)
我会用MD5进行校验和(例如)而不是字节comaprasion加上日期检查,并取决于你需要的名字检查。
答案 5 :(得分:-2)
炮轰cmp
怎么样?
import commands
status, output = commands.getstatusoutput("/usr/bin/cmp file1 file2")
if (status == 0):
print "files are same"
elif (status == 1):
print "files differ"
else:
print "uh oh!"