このスレッドのその他の回答はbotoに関連していますが、S3.Objectはboto3でもうiterableではありません。だから、動作しません以下は、それがTypeError: 's3.Object' object is not iterable
エラーメッセージ生成します。
s3 = boto3.session.Session(profile_name=my_profile).resource('s3')
s3_obj = s3.Object(bucket_name=my_bucket, key=my_key)
with io.FileIO('sample.txt', 'w') as file:
for i in s3_obj:
file.write(i)
boto3で、オブジェクトの内容がS3.Object.get()['Body']
で利用できるいずれかの反復可能ではないので、以下はまだ動作しません。
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body.read():
file.write(i)
:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body:
file.write(i)
ので、常に可能性がされていない代替は、readメソッドを使用することですが、これは、大きなファイルを扱うメモリ全体S3オブジェクトをロードします
しかし、read
メソッドでは、amt
パラメータを渡して、元のストリームから読み込みたいバイト数を指定できます。次のように
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
while file.write(body.read(amt=512)):
pass
一つは、基になるストリームも利用可能であることを認識しbotocore.response.StreamingBody
コードを掘り下げるので、我々は繰り返すことができます::このメソッドは、ストリーム全体が読み込まれるまで、繰り返し呼び出すことができ
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for b in body._raw_stream:
file.write(b)
ながら私はまた、使用することができ、いくつかのリンクを見てきましたが、私は試していないグーグル:
[smart_open](https://github.com/piskvorky/smart_open)Pythonライブラリそれは(読み書きの両方のために)行います。 – Radim