导入hashlib库(md5方法是其中的一部分)
import hashlib 要检查的文件
file_name = "test.apk" 正确的原始md5在这里
original_md5 = '5d41402abc4b2a76b9719d911017c592' 打开、关闭、读取文件并计算其内容的MD5
with open(file_name) as file_to_check:
# read contents of the file
data = file_to_check.read()
md5_returned = hashlib.md5(data).hexdigest()最后,将原始MD5与新计算结果进行比较。
if original_md5 == md5_returned:
print ("MD5 verified.")
else:
print ("MD5 verification failed!.")错误
File "newhash.py", line 15, in <module>
data = file_to_check.read()
File "C:\Users\AppData\Local\Programs\Python\Python35-32\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 286: character maps to <undefined>发布于 2016-11-06 13:10:47
要计算校验和(md5、sha1等),必须以二进制模式打开文件,因为您将对字节值进行求和:
要使py27/py3可移植,您应该使用io包,如下所示:
import hashlib
import io
def md5sum(src):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
content = fd.read()
md5.update(content)
return md5如果您的文件很大,您可能更喜欢按块读取该文件,以避免将整个文件内容存储在内存中:
def md5sum(src, length=io.DEFAULT_BUFFER_SIZE):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
return md5如果您的文件是真正的大文件,您可能还需要显示进度信息。为此,您可以调用一个回调函数,该函数打印或记录计算的字节数:
def md5sum(src, callback, length=io.DEFAULT_BUFFER_SIZE):
calculated = 0
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
calculated += len(chunk)
callback(calculated)
return md5发布于 2016-11-06 12:51:56
问题是,您将该文件作为文本文件而不是二进制文件读取。不知道是使用python2还是python3,但在这两种情况下,您都可以找到如何从文件中读取字节,而不是将它们解释为字符串。
https://stackoverflow.com/questions/40449442
复制相似问题