2012-03-21 3 views
1

두 파일의 체크섬을 만들어 비교하려고합니다. 이 스크립트는 내가 사용하고있는 스크립트입니다 :두 개의 큰 파일의 파이썬 체크섬 확인

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).

hashsum을 16 진수 문자열로 가져 오려면 (사람이 소비 할 때) h.digest() 대신 h.hexdigest()을 호출하면 해시 덤을 바이트로 반환합니다 (사람이 읽을 수는 없지만 더 가볍습니다).

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

하지만 당신은 아마 hexdigest()를 사용하려면 대신 당신은() 이 checkF (F)를 호출 한 후이 넣어주세요 때때로, f.close와 파이썬 반환 예측할 수없는 결과가 파일을 닫습니다 잊어 버렸습니다 'n 프로그램의 마지막에 파일을 닫는다.

-1

당신이 한 경우

+0

-1 * 모든 응용 프로그램 (파이썬이든 아니든간에)이 모든 핸들을 닫지 않고 종료되면 모든 운영 체제가 예상대로 파일을 닫습니다. 'f.close'를 명시 적으로 호출해서는 안됩니다. 대신 컨텍스트 관리자를 사용하십시오. – phihag

+0

컨텍스트 관리자를 사용할 수있는 파이썬> = 2.6, 그래서 당신은 부분적으로 사실입니다. – nickzam

관련 문제