requests
URLデータをチャンクで読み取ることをサポートし、hashlib
ライブラリではMD5をチャンクで計算できるため、必要なものがすべて揃っています。.iter_lines()
またはから選択できます.iter_content()
:
import requests
import hashlib
r = requests.get(url, stream=True)
sig = hashlib.md5()
for line in r.iter_lines():
sig.update(line)
print(sig.hexdigest())
フィルタとして表示する必要がある場合は、ジェネレータを使用してください。
class MD5TransparentFilter:
def __init__(self, source):
self._sig = hashlib.md5()
self._source = source
def __iter__(self):
for line in self._source:
self._sig.update(line)
yield line
def hexdigest(self):
return self._sig.hexdigest()
.iter_lines()
次に、または.iter_content()
イテレータでそれを使用します。
r = requests.get(url, stream=True)
filtered = MD5TransparentFilter(r.iter_content(1000))
for line in filtered:
# do something with the line
print(filtered.hexdigest())
の代わりにインターフェースshutil.copyfileobj()
を実装する必要がありますが、原則は同じです。.read()
.__iter__()
class MD5TransparentFile:
def __init__(self, source):
self._sig = hashlib.md5()
self._source = source
def read(self, buffer):
# we ignore the buffer size, just use the `.next()` value in the source iterator
try:
line = self._source.next()
self._sig.update(line)
return line
except StopIteration:
return b''
def hexdigest(self):
return self._sig.hexdigest()
MD5TransparentFile()
クラスはあなた.iter_content()
または.iter_lines()
イテレータを取得し、への呼び出しごとにそのデータからデータを返し、その.read()
場でMD5を計算します。これは、例に直接使用できますshutil.copyfileobj()
。