Python 3中的哈希文件?
在Python 2中,可以通过运行以下命令来散列字符串:Python 3中的哈希文件?,python,hash,Python,Hash,在Python 2中,可以通过运行以下命令来散列字符串: someText = "a" hashlib.sha256(someText).hexdigest() 但在Python 3中,需要对其进行编码: someText = "a".encode("ascii") hashlib.sha256(someText).hexdigest() 但当我尝试使用文件时: f = open(fin, "r") sha = hashlib.sha256() while True: data =
someText = "a"
hashlib.sha256(someText).hexdigest()
但在Python 3中,需要对其进行编码:
someText = "a".encode("ascii")
hashlib.sha256(someText).hexdigest()
但当我尝试使用文件时:
f = open(fin, "r")
sha = hashlib.sha256()
while True:
data = f.read(2 ** 20).encode("ascii")
if not data:
break
sha.update(data)
f.close()
我在许多文件中都看到了这一点:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position 8: invalid continuation byte
我认为这是因为它是一个二进制文件,很可能无法转换为ASCII
如何对文件进行编码而不出现此问题?在Unix系统上,在Python 2中,二进制和文本模式文件之间没有区别,因此如何打开它们无关紧要 但在Python3中,它在每个平台上都很重要
sha256()
需要二进制输入,但您以文本模式打开了文件。这就是@BrenBam建议您以二进制模式打开文件的原因
由于您以文本模式打开了文件,Python 3认为需要对文件中的位进行解码,才能将字节转换为Unicode字符串。但你根本不想解码,对吧
然后以二进制模式打开文件,您将读取字节字符串,这正是sha256()
所需要的
顺便说一下,您的:
someText = "a".encode("ascii")
hashlib.sha256(someText).hexdigest()
可以通过相关方式更轻松地完成:
hashlib.sha256(b"a").hexdigest()
也就是说,直接将二进制数据传递给它,而不必费心编码Unicode字符串(字面的
“a”
就是这样)。试着用open(fin,“rb”)
以二进制模式打开文件。我编写了一个模块,可以用不同的算法散列大文件
pip3 install py_essentials
使用如下模块:
from py_essentials import hashing as hs
hash = hs.fileChecksum("path/to/the/file.txt", "sha256")
看一看。试着用
open(fin,“rb”)以二进制模式打开文件。
@BrenBarn工作得很好,你应该回答这个问题。