2017-03-21 3 views
1

En Python/Boto 3, Appris que pour télécharger un fichier individuellement à partir de S3 au niveau local peut effectuer les opérations suivantes:Python/Boto 3: Comment récupérer/télécharger des fichiers depuis AWS S3?

 bucket = self._aws_connection.get_bucket(aws_bucketname) 
     for s3_file in bucket.list(): 
      if filename == s3_file.name: 
       self._downloadFile(s3_file, local_download_directory) 
       break; 

Et pour télécharger tous les fichiers sous un répertoire choisi:

else: 
     bucket = self._aws_connection.get_bucket(aws_bucketname) 
     for s3_file in bucket.list(): 
      self._downloadFile(s3_file, local_download_directory) 

Et fonction d'aide _downloadFile():

def _downloadFile(self, s3_file, local_download_destination): 
     full_local_path = os.path.expanduser(os.path.join(local_download_destination, s3_file.name)) 
     try: 
      print "Downloaded: %s" % (full_local_path) 
      s3_file.get_contents_to_filename(full_local_path) 

Mais les deux ne semblent pas fonctionner. En utilisant Boto 3 et Python, j'aimerais pouvoir télécharger tous les fichiers, comme un zip de préférence, sous un répertoire défini sur S3 vers mon local.

Que pourrais-je faire de mal, et quelle est la bonne implémentation des paramètres?

Nous vous remercions à l'avance, et être sûr d'accepter/Upvote répondre

MISE À JOUR CODE: Getting an error: “AttributeError: 'S3' object has no attribute

import sys 
import json 
import os 
import subprocess 

import boto3 
from boto.s3.connection import S3Connection 

s3 = boto3.resource('s3') 
s3client = boto3.client('s3') 

#This works 
for bucket in s3.buckets.all(): 
    print(bucket.name) 

def main(): 
    #Getting an error: “AttributeError: 'S3' object has no attribute 'download’” 
    s3client.download('testbucket', 'fileone.json', 'newfile') 

if __name__ == "__main__": main() 
+1

"ne semble pas fonctionner"? Qu'est-ce qui ne fonctionne pas exactement? Voyez-vous des erreurs? – oshaiken

+0

@oshaiken Il ne se connecte à rien et rien n'est en cours de téléchargement. Est-ce que je prends la bonne approche? Merci d'avance –

Répondre

0

Pour télécharger les fichiers de S3 à FS locale, utilisez la méthode download_file()

s3client = boto3.client('s3') 
s3client.download_file(Bucket, Key, Filename) 

Si l'objet S3 est s3://mybucket/foo/bar/file.txt, les arguments sont alors

Bucket --> mybucket 
Key  --> foo/bar/file.txt 
Filename --> /local/path/file.txt 

Il n'existe aucune méthode pour télécharger le compartiment entier. Une autre méthode consisterait à lister tous les objets du compartiment et à les télécharger individuellement sous forme de fichiers.

for obj in s3client.list_objects(Bucket='mybucket')['Contents']: 
    try: 
     filename = obj['Key'].rsplit('/', 1)[1] 
    except IndexError: 
     filename = obj['Key'] 

    localfilename = os.path.join('/home/username/Downloads/', filename) # The local directory must exist. 
    s3client.download_file('mybucket', obj['Key'], localfilename) 

Note: La réponse de list_objects() est tronquée à 1000 objets. Utilisez les marqueurs dans la réponse pour récupérer le reste des objets dans le compartiment.

+0

Appréciez votre réponse. J'ai essayé s3client.download_file (Bucket, Key, Filename) mais j'ai rencontré une erreur: 'AttributeError: L'objet 'S3' n'a pas d'attribut 'download''. Que pourrais-je faire de mal? Aussi pour le paramètre 'Filename', est-ce là où je définis le chemin vers mon répertoire local vers lequel j'aimerais que le fichier soit sauvegardé? Si oui, comment puis-je trouver le chemin? Je voudrais juste le télécharger dans le dossier 'Download'. S'il vous plaît jeter un oeil à l'article original. Mis à jour avec un extrait de code. –

+0

Également obtenu 'IndexError: liste index hors de portée' aussi bien. –

+0

@SsRse c'est 'download_file' et non' download'. Veuillez vérifier la réponse mise à jour pour le chemin de téléchargement et IndexError. – franklinsijo