2013-10-13 43 views
3

在Python 2中,人們可以通過只是運行哈希的字符串:在Python 3中散列文件?

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。

如何在沒有此問題的情況下對文件進行編碼?

+4

嘗試用'open(fin,「rb」)'以二進制模式打開文件。 – BrenBarn

+0

@BrenBarn完美地工作,你應該回答這個問題。 –

回答

4

在Unix系統上,在Python 2中二進制和文本模式文件沒有區別,所以打開它們並不重要。

但是在Python 3中,它對每個平臺都很重要。 sha256()需要二進制輸入,但是您在文本模式下打開了該文件。這就是爲什麼@BrenBam建議你以二進制模式打開文件。

由於您在文本模式下打開文件,因此Python 3認爲它需要解碼文件中的位以將字節轉換爲Unicode字符串。但是你根本不需要解碼,對吧?

然後以二進制模式打開文件,您將讀取字節字符串,而這正是sha256()想要的。

順便說一句,你的:

someText = "a".encode("ascii") 
hashlib.sha256(someText).hexdigest() 

可以在相關的方式更容易實現:

hashlib.sha256(b"a").hexdigest() 

也就是說,它直接傳遞二進制數據,而不是用編碼困擾Unicode字符串(文字"a"是)。

5

嘗試使用open(fin, "rb")以二進制模式打開文件。

0

我編寫了一個模塊,它能夠用不同的算法散列大文件。

pip3 install py_essentials 

使用模塊是這樣的:

from py_essentials import hashing as hs 
hash = hs.fileChecksum("path/to/the/file.txt", "sha256") 

看一看的documentation