Ich versuche eine "Hallo Welt" mit dem neuen boto3 Client für AWS zu machen.
Der Anwendungsfall, den ich habe, ist ziemlich einfach: Holen Sie sich ein Objekt aus S3 und speichern Sie 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 keinen sauberen Weg finden, um dasselbe zu tun, daher iteriere 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 funktioniert gut. Ich habe mich gefragt, ob es eine "native" boto3-Funktion gibt, die dieselbe Aufgabe übernimmt.
upload_file
Methode verwendet automatisch mehrteilige Uploads für große Dateien.boto3 hat jetzt eine schönere Oberfläche als der Client:
Dies allein ist nicht enorm besser als die
client
in der akzeptierten Antwort (obwohl die docs sagen , dass es eine bessere Arbeit Up- und Downloads bei einem Fehler Neuen Versuch) aber wenn man bedenkt , dass die Ressourcen im Allgemeinen ergonomischer sind (zum Beispiel der s3 Eimer und Objekt - Ressourcen sind netter als die Client-Methoden) Dies ermöglicht es Ihnen, auf der Ressourcenebene zu bleiben, ohne herunterfallen zu müssen.Resources
Im Allgemeinen können sie auf die gleiche Weise wie Clients erstellt werden. Sie verwenden alle oder die meisten der gleichen Argumente und leiten sie einfach an ihre internen Clients weiter.quelle
my_bucket.upload_file()
(odermy_bucket.upload_fileobj()
wenn Sie ein BytesIO-Objekt haben).resource
es besser ist, es erneut zu versuchen? Ich konnte keinen solchen Hinweis finden.Für diejenigen unter Ihnen, die
set_contents_from_string
ähnliche boto2-Methoden simulieren möchten, können Sie es versuchenFür Python3:
In Python3 sind sowohl StringIO als auch cStringIO weg . Verwenden Sie den
StringIO
Import wie folgt:So unterstützen Sie beide Versionen:
quelle
quelle
aws configure
Befehl awscli definiert werden und werden automatisch von gefundenbotocore
.Wenn Sie eine Datei mit einer anderen Konfiguration als der Standardkonfiguration lesen möchten, können Sie entweder
mpu.aws.s3_download(s3path, destination)
direkt oder den kopierten Code verwenden:quelle
NameError: name '_s3_path_split' is not defined
Hinweis: Ich gehe davon aus, dass Sie die Authentifizierung separat konfiguriert haben. Der folgende Code dient zum Herunterladen des einzelnen Objekts aus dem S3-Bucket.
quelle