检查文件是否相等

时间:2010-11-26 08:32:45

标签: python file equality

在Python中检查文件是否相同的最优雅的方法是什么? 校验?字节比较?认为文件不会超过100-200 MB

6 个答案:

答案 0 :(得分:9)

filecmp模块怎么样?它可以通过不同的权衡以多种不同的方式进行文件比较。

更好的是,它是标准库的一部分:

http://docs.python.org/library/filecmp.html

答案 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!"