2012-03-21 1 views
1

J'essaie de créer une somme de contrôle de deux fichiers pour les comparer. C'est le script que j'utilise:Python checksum vérification de deux gros fichiers

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' 

Premièrement, je ne connais pas la sortie. Est-ce la chaîne que je peux utiliser pour comparer à l'autre fichier? Deuxièmement, exécuter ce script sur le même fichier une deuxième fois donne un résultat différent. Cela semble être lié au temps qui s'est écoulé entre les passes. Je ne comprends pas complètement ce qui se passe ici. Toute aide est la bienvenue.

+0

essayez d'ouvrir et de fermer le fichier dans 'checkF'. – Ben

Répondre

3

Vous devez rouvrir le fichier chaque fois que vous appelez checkF, ou réinitialisez la position du pointeur de fichier avec f.seek(0). C'est pourquoi vous obtenez différents hashsums: le premier est le hash du contenu du fichier, et tous les autres sont des hashsums de la chaîne vide (c'est-à-dire da39a3ee5e6b4b0d3255bfef95601890afd80709).

Pour obtenir le hashsum sous la forme d'une chaîne hexadécimale (pour la consommation humaine), appelez simplement h.hexdigest() au lieu de h.digest(), ce qui renvoie le hashsum comme une chaîne d'octets (plus compact, mais non lisible).

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

Mais vous voulez probablement utiliser simplement hexdigest() à la place

-1

Vous avez oublié de fermer le fichier avec f.close() S'il vous plaît mettre cette après avoir appelé checkF (f), parfois renvoie python résultats imprévisibles si vous avez Fermez le fichier à la fin de votre programme.

+0

-1 Si * toute * application (que Python ou non) se termine sans fermer toutes ses poignées, chaque système d'exploitation fermera les fichiers de manière prévisible. Vous ne devriez pas appeler explicitement 'f.close' de toute façon. Au lieu de cela, utilisez un gestionnaire de contexte. – phihag

+0

Les gestionnaires de contextes sont disponibles sur python> = 2.6, donc votre recommandation est partiellement vraie. – nickzam