两个大文件的python校验和验证

两个大文件的python校验和验证,python,hashlib,Python,Hashlib,我试图创建两个文件的校验和来比较它们。这是我正在使用的脚本: import hashlib import datetime f = open('myfile.mov', 'rb') def checkF(f, block_size=2**20): ... print datetime.datetime.now() ... h = hashlib.sha1() ... while True: ... data = f.read(block_size)

我试图创建两个文件的校验和来比较它们。这是我正在使用的脚本:

import hashlib
import datetime
f = open('myfile.mov', 'rb')
def checkF(f, block_size=2**20):
...     print datetime.datetime.now()
...     h = hashlib.sha1()
...     while True:
...             data = f.read(block_size)
...             if not data:
...                     break
...             h.update(data)
...     print datetime.datetime.now()
...     return h.digest()
... 
>>> checkF(f)
2012-03-21 09:33:40.704032
2012-03-21 09:33:40.704490
'\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'

首先,我不熟悉输出。这是我可以用来与其他文件进行比较的字符串吗?其次,在同一个文件上再次运行此脚本会得到不同的结果。这似乎与两次传球之间经过了多少时间有关。我不完全明白这里发生了什么。任何帮助都很好。

每次调用checkF时都必须重新打开文件,或者使用重置文件指针的位置。这就是为什么会得到不同的哈希和:第一个是文件内容的哈希,后面所有的哈希和都是空字符串的哈希和(即da39a3ee5e6b4b0d3255bfef95601890afd80709)

要以十六进制字符串的形式获取哈希值(供人类使用),只需调用而不是
h.digest()
,后者将哈希值作为bytestring返回(更紧凑,但不是人类可读的)


但您可能只想使用
hexdigest()
而不是您忘记了使用f.close()关闭文件
请在调用checkF(f)后再执行此操作,如果在程序结束时没有关闭文件,python有时会返回不可预测的结果。

尝试在
checkF
-1中打开和关闭文件,如果任何应用程序(无论是否为python)终止而未关闭其所有句柄,每个操作系统都会按预期关闭文件。无论如何,您不应该显式调用
f.close
。相反,请使用上下文管理器。python>=2.6上提供的上下文管理器,因此您的建议部分正确。
>>> '\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'.encode('hex')
'da39a3ee5e6b4b0d3255bfef95601890afd80709'