Python 3中的哈希文件?

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 =

在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 = 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工作得很好,你应该回答这个问题。