So speichern Sie S3-Objekt in einer Datei mit boto3

Ich versuche, eine "hallo Welt" mit neuen boto3 Client für AWS zu machen.

Der Use-Case habe ich ziemlich einfach: bekomme Objekt von S3 und speichere es in der Datei.

In boto 2.XI würde es so machen:

import boto key = boto.connect_s3().get_bucket('foo').get_key('foo') key.get_contents_to_filename('/tmp/foo') 

In boto 3 Ich kann nicht einen sauberen Weg finden, dasselbe zu tun, also verwende ich manuell über das "Streaming" Objekt:

 import boto3 key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get() with open('/tmp/my-image.tar.gz', 'w') as f: chunk = key['Body'].read(1024*8) while chunk: f.write(chunk) chunk = key['Body'].read(1024*8) 

oder

 import boto3 key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get() with open('/tmp/my-image.tar.gz', 'w') as f: for chunk in iter(lambda: key['Body'].read(4096), b''): f.write(chunk) 

Und es geht gut Ich habe mich gefragt, gibt es irgendeine "native" boto3 Funktion, die die gleiche Aufgabe machen wird?

4 Solutions collect form web for “So speichern Sie S3-Objekt in einer Datei mit boto3”

Es gibt eine Anpassung, die in Boto3 vor kurzem ging, was dazu beiträgt (unter anderem). Es ist derzeit auf dem Low-Level-S3-Client ausgesetzt und kann so verwendet werden:

 s3_client = boto3.client('s3') open('hello.txt').write('Hello, world!') # Upload the file to S3 s3_client.upload_file('hello.txt', 'MyBucket', 'hello-remote.txt') # Download the file from S3 s3_client.download_file('MyBucket', 'hello-remote.txt', 'hello2.txt') print(open('hello2.txt').read()) 

Diese Funktionen werden automatisch mit Lese- / Schreib-Dateien verknüpft sowie Multipart-Uploads parallel für große Dateien durchgeführt.

Boto3 hat jetzt eine schönere Schnittstelle als der Client:

 resource = boto3.resource('s3') my_bucket = resource.Bucket('MyBucket') my_bucket.download_file(key, local_filename) 

Dies allein ist nicht enorm besser als der client in der akzeptierten Antwort (obwohl die docs sagen, dass es einen besseren Job wiederholt Uploads und Downloads auf Ausfall), aber unter Berücksichtigung, dass Ressourcen sind in der Regel mehr ergonomisch (zum Beispiel die s3 Eimer und Objekt Ressourcen sind schöner als die Client-Methoden) Dies ermöglicht es Ihnen, auf der Ressource-Schicht bleiben, ohne zu fallen.

Resources können in der Regel in der gleichen Weise wie Kunden erstellt werden, und sie nehmen alle oder die meisten der gleichen Argumente und nur weiterleiten sie an ihre internen Clients.

Für diejenigen unter Ihnen, die die set_contents_from_string wie boto2 Methoden simulieren möchten, können Sie versuchen

 import boto3 from cStringIO import StringIO s3c = boto3.client('s3') contents = 'My string to save to S3 object' target_bucket = 'hello-world.by.vor' target_file = 'data/hello.txt' fake_handle = StringIO(contents) # notice if you do fake_handle.read() it reads like a file handle s3c.put_object(Bucket=target_bucket, Key=target_file, Body=fake_handle.read()) 
 # Preface: File is json with contents: {'name': 'Android', 'status': 'ERROR'} import boto3 import io s3 = boto3.resource( 's3', aws_access_key_id='my_access_id', aws_secret_access_key='my_secret_key' ) obj = s3.Object('my-bucket', 'key-to-file.json') data = io.BytesIO() obj.download_fileobj(data) # object is now a bytes string, Converting it to a dict: new_dict = json.loads(data.getvalue().decode("utf-8")) print(new_dict['status']) # Should print "Error" 
  • Wie kann ich leicht feststellen, ob eine Boto 3 S3 Eimerressource existiert?
  • Python / Boto 3: Wie kann ich Dateien von AWS S3 abrufen / herunterladen?
  • Mocking boto3 S3 Client-Methode Python
  • Lesen Sie den Inhalt der Datei von S3 Eimer mit boto3
  • Ist es möglich, den Inhalt einer S3-Datei zu laden, ohne sie mit boto3 herunterzuladen?
  • Ausnahme in Boto3 - botocore.exceptions.EndpointConnectionError
  • AWS Boto3 BASE64 Kodierungsfehler, der beim Aufruf der Methode client.request_spot_instances ausgelöst wurde
  • PyCharm intellisense für boto3
  • Django StreamingHttpResponse Format Fehler
  • Um zu überprüfen, ob die AWS-Instanz nach dem Neustart mit python auftritt
  • Boto3 aws api - Auflistung vorhandene Instanztypen
  • Python ist die beste Programmiersprache der Welt.