我如何计算Python中的文件的MD5校验和?
我在python中创build了一个代码,用于检查文件中的md5,并确保md5与原始文件匹配。 这是我所开发的:
#Defines filename filename = "file.exe" #Gets MD5 from file def getmd5(filename): return m.hexdigest() md5 = dict() for fname in filename: md5[fname] = getmd5(fname) #If statement for alerting the user whether the checksum passed or failed if md5 == '>md5 will go here<': print("MD5 Checksum passed. You may now close this window") input ("press enter") else: print("MD5 Checksum failed. Incorrect MD5 in file 'filename'. Please download a new copy") input("press enter") exit
但是每当我运行代码,我得到以下内容:
Traceback (most recent call last): File "C:\Users\Username\md5check.py", line 13, in <module> md5[fname] = getmd5(fname) File "C:\Users\Username\md5check.py, line 9, in getmd5 return m.hexdigest() NameError: global name 'm' is not defined
在我的代码中有什么我缺less?
关于你的错误和你的代码中缺less的东西。 m是没有为getmd5()函数定义的名称。 没有冒犯,我知道你是一个初学者,但你的代码是在所有的地方。 让我们看看你的问题一个接一个:)首先,你没有正确使用hashlib.md5.hexdigest()方法。 请查找有关haslib函数Python Doc Library的说明 。 返回提供的string md5的正确方法是做这样的事情:
>>> import hashlib >>> hashlib.md5("filename.exe").hexdigest() '2a53375ff139d9837e93a38a279d63e5'
但是,这里你有更大的问题。 您正在计算文件名string上的MD5,实际上,MD5是基于文件内容计算的。 您将需要基本读取文件内容,并通过md5pipe道。 我的下一个例子不是很有效率,但类似的东西:
>>> import hashlib >>> hashlib.md5(open('filename.exe','rb').read()).hexdigest() 'd41d8cd98f00b204e9800998ecf8427e'
正如你可以清楚地看到第二个MD5哈希与第一个完全不同。 原因是我们正在推送文件的内容,而不仅仅是文件名。 一个简单的解决scheme可能是这样的:
# Import hashlib library (md5 method is part of it) import hashlib # File to check file_name = 'filename.exe' # Correct original md5 goes here original_md5 = '5d41402abc4b2a76b9719d911017c592' # Open,close, read file and calculate MD5 on its contents with open(file_name) as file_to_check: # read contents of the file data = file_to_check.read() # pipe contents of the file through md5_returned = hashlib.md5(data).hexdigest() # Finally compare original MD5 with freshly calculated if orginal_md5 == md5_returned: print "MD5 verified." else: print "MD5 verification failed!."
请看后Python:生成一个文件的MD5校验和,它详细地解释了如何有效地实现它的方法。
祝你好运。