2012-03-21 1 views
1

Я пытаюсь создать контрольную сумму двух файлов для их сравнения. Это сценарий, который я использую:проверка контрольной суммы python двух больших файлов

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' 

Во-первых, я не знаком с выходом. Это строка, которую я могу использовать для сравнения с другим файлом? Во-вторых, запуск этого скрипта в том же файле второй раз дает другой результат. Кажется, это связано с тем, сколько времени прошло между проходами. Я не совсем понимаю, что здесь происходит. Любая помощь будет большой.

+0

попробуйте открыть и закрыть файл внутри 'checkF'. – Ben

ответ

3

Необходимо повторно открыть файл каждый раз, когда вы вызываете checkF, или сбросить положение указателя файла с помощью f.seek(0). Вот почему вы получаете разные хешсумы: первый - это хэш содержимого файла, а все последние - хешсумы пустой строки (т. Е. da39a3ee5e6b4b0d3255bfef95601890afd80709).

Чтобы получить хешсум в виде шестнадцатеричной строки (для потребления человеком), просто вызовите h.hexdigest() вместо h.digest(), который возвращает хешсум как байтовое (более компактное, но не читаемое человеком).

0
>>> '\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'.encode('hex') 
'da39a3ee5e6b4b0d3255bfef95601890afd80709' 

Но вы, вероятно, хотите просто использовать hexdigest() вместо

-1

Вы забыли закрыть файл с f.close() Пожалуйста, поставьте это после вызова checkF (F), иногда питон возвращает непредсказуемые результаты, если вы сделали 'закрыть файл в конце вашей программы.

+0

-1 Если приложение * any * (будь то Python или нет) завершается без закрытия всех его ручек, каждая операционная система будет предсказуемо закрывать файлы. Вы не должны явно указывать 'f.close' в любом случае. Вместо этого используйте диспетчер контекста. – phihag

+0

Контекстные менеджеры доступны на python> = 2.6, поэтому вы частично отсылаете рекомендации. – nickzam