Matt の回答を見ると、必ずしもすべての読み取りメソッドを実装する必要がないことがわかります。read1
次のように説明されています。
基になる生ストリームの read() への最大 1 回の呼び出しで、最大でsizeバイトを読み取って返します...
io.TextIOWrapper
次に、たとえば の実装を持つものでラップできますreadline
。boto.s3.key.Key
例として、読み取り用のイテレーターを実装するS3 (Amazon Simple Storage Service) からの CSV ファイルのストリーミングを次に示します。
import io
import csv
from boto import s3
class StringIteratorIO(io.TextIOBase):
def __init__(self, iter):
self._iterator = iter
self._buffer = ''
def readable(self):
return True
def read1(self, n=None):
while not self._buffer:
try:
self._buffer = next(self._iterator)
except StopIteration:
break
result = self._buffer[:n]
self._buffer = self._buffer[len(result):]
return result
conn = s3.connect_to_region('some_aws_region')
bucket = conn.get_bucket('some_bucket')
key = bucket.get_key('some.csv')
fp = io.TextIOWrapper(StringIteratorIO(key))
reader = csv.DictReader(fp, delimiter = ';')
for row in reader:
print(row)
アップデート
これは、少し良く見える関連する質問への回答です。を継承io.RawIOBase
してオーバーライドしますreadinto
。Python 3 では十分なので、1 でラップする代わりに でラップIterStream
できio.BufferedReader
ますio.TextIOWrapper
。Python では 2read1
が必要ですが、単純に表現できますreadinto
。