Altre risposte in questo thread sono correlate a boto, ma S3.Object non è più ripetibile in boto3. Quindi, quanto segue non funziona, produce un messaggio di TypeError: 's3.Object' object is not iterable
errore:
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)
In boto3, i contenuti dell'oggetto sono disponibili sul S3.Object.get()['Body']
che non è un iterabile o, in modo quanto segue NON funzionano ancora:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body:
file.write(i)
Così, in alternativa è quella di utilizzare il metodo di lettura, ma questo carica l'oggetto S3 TUTTO in memoria, che quando si tratta di file di grandi dimensioni non è sempre una possibilità:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body.read():
file.write(i)
Ma il metodo read
consente di passare il parametro amt
specificando il numero di byte che si desidera leggere dal flusso sottostante. Questo metodo può essere ripetutamente chiamato finché l'intero flusso è stato letto:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
while file.write(body.read(amt=512)):
pass
Scavare botocore.response.StreamingBody
codice si accorge che il flusso sottostante è inoltre disponibile, così abbiamo potuto scorrere come segue:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for b in body._raw_stream:
file.write(b)
Mentre googling ho visto anche alcuni link che potrebbero essere l'uso, ma non ho provato:
L'(https://github.com/piskvorky/smart_open) libreria Python [smart_open] fa quello (sia per leggere che per scrivere). – Radim