ファイルのチェックサムを出力する小さなスクリプトを作成しようとしています( https://Gist.github.com/Zireael-N/ed36997fd1a967d78cb2 のコードを使用):
import sys
import os
import hashlib
file = '/Users/Me/Downloads/2017-11-29-raspbian-stretch.img'
with open(file, 'rb') as f:
contents = f.read()
print('SHA256 of file is %s' % hashlib.sha256(contents).hexdigest())
しかし、次のエラーメッセージが表示されます。
Traceback (most recent call last):
File "checksum.py", line 8, in <module>
contents = f.read()
OSError: [Errno 22] Invalid argument
私は何を間違えていますか? macOS High Sierraでpython 3を使用しています
そこに されているいくつか問題 Python(最近のバージョンで最も修正された))ファイルハンドルから一度に2〜4 GBハッシュに使用できる回避策は、固定サイズのチャンクでハッシュを更新することです(RAMがファイルサイズよりも大きいことを考えるのはお勧めできません)。最も簡単なアプローチは、コードを次のように変更することです。
with open(file, 'rb') as f:
hasher = hashlib.sha256() # Make empty hasher to update piecemeal
while True:
block = f.read(64 * (1 << 20)) # Read 64 MB at a time; big, but not memory busting
if not block: # Reached EOF
break
hasher.update(block) # Update with new block
print('SHA256 of file is %s' % hasher.hexdigest()) # Finalize to compute digest
あなたが空想を感じているなら、2引数のiter
といくつかのfunctools
魔法を使用してループを「単純化」し、while
ループ全体を次のように置き換えることができます。
for block in iter(functools.partial(f.read, 64 * (1 << 20)), b''):
hasher.update(block)