在Python中,检查两个文件是否相等最优雅的方式是什么?使用校验和?比较字节?考虑到文件大小不会超过100-200 MB。
那么 filecmp
模块怎么样呢?它可以用不同的方式进行文件比较,每种方式都有不同的权衡。
更好的是,它是标准库的一部分:
#! /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模块可以满足您的需求,并且还有比较目录的方法。 我之前并不知道这个模块,我也在学习Python :-)
>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst')
True
>>> filecmp.cmp('undoc.rst', 'index.rst')
False
好的,这可能需要两个不同的回答。
如果您有许多文件需要比较,请使用校验和,并为每个文件缓存校验和。为确保准确性,请在此之后逐字节比较匹配的文件。
如果您只有两个文件,请直接进行字节比较,因为您必须读取文件才能计算校验和。
在两种情况下,都可以使用文件大小作为早期检查不等式的方法。
a == b == c == d
,那么我不认为它有意义。如果您想要像 e in (a, b, c, d)
这样的东西,并且您随后想要使用 e、f、g
等进行操作,那么我认为校验和开始变得划算了。 - aaronasterling在尝试其他解决方案之前,您可能想要对两个文件执行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
我会使用MD5(例如)进行校验和,而不是字节比较加日期检查,并根据您的需求进行名称检查。
那么使用 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!"
shallow
参数,filecmp 支持此操作。 - wump