2017-07-28 3 views
1

Les autres questions que j'ai pu trouver se rapportaient à une ancienne version de Boto. Je voudrais télécharger le dernier fichier d'un seau S3. Dans le documentation j'ai trouvé qu'il y a une méthode list_object_versions() qui vous obtient un IsLatest booléen. Malheureusement, j'ai seulement réussi à établir une connexion et à télécharger un fichier. Pourriez-vous s'il vous plaît me montrer comment je peux étendre mon code pour obtenir le dernier fichier du seau? MerciComment télécharger le dernier fichier d'un seau S3 en utilisant Boto3?

import boto3 
conn = boto3.client('s3', 
        region_name="eu-west-1", 
        endpoint_url="customendpoint", 
        config=Config(signature_version="s3", s3={'addressing_style': 'path'})) 

D'ici, je ne sais pas comment aller d'un seau appelé mytestbucket le dernier fichier ajouté. Il y a plusieurs fichiers csv dans le seau mais bien sûr avec un nom différent.

Mise à jour:

import boto3 
from botocore.client import Config 

s3 = boto3.resource('s3', region_name="eu-west-1", endpoint_url="custom endpoint", aws_access_key_id = '1234', aws_secret_access_key = '1234', config=Config(signature_version="s3", s3={'addressing_style': 'path'})) 
my_bucket = s3.Bucket('mytestbucket22') 
unsorted = [] 
for file in my_bucket.objects.filter(): 
    unsorted.append(file) 

files = [obj.key for obj in sorted(unsorted, key=get_last_modified, reverse=True)][0:9] 

Cela me donne l'erreur suivante:

NameError: name 'get_last_modified' is not defined 
+0

Vérifiez ma réponse. Il devrait donner le dernier fichier ajouté. – helloV

Répondre

0

Vous devriez être en mesure de télécharger la dernière version du fichier en utilisant la commande de fichier de téléchargement par défaut

import boto3 
import botocore 

BUCKET_NAME = 'mytestbucket' 
KEY = 'fileinbucket.txt' 

s3 = boto3.resource('s3') 

try: 
    s3.Bucket(BUCKET_NAME).download_file(KEY, 'downloadname.txt') 
except botocore.exceptions.ClientError as e: 
    if e.response['Error']['Code'] == "404": 
     print("The object does not exist.") 
    else: 
     raise 

Référence link

Pour obtenir le dernier fichier modifié ou téléchargé, vous pouvez utiliser les éléments suivants

s3 = boto3.resource('s3') 
my_bucket = s3.Bucket('myBucket') 
unsorted = [] 
for file in my_bucket.objects.filter(): 
    unsorted.append(file) 

files = [obj.key for obj in sorted(unsorted, key=get_last_modified, 
    reverse=True)][0:9] 

Comme réponse dans cette référence link états, son pas optimale mais il fonctionne.

+0

Merci. Peut-être que ma question n'était pas assez claire. Je viens de l'éditer et j'ai fourni plus d'informations. Je voudrais télécharger le dernier fichier à partir d'un seau qui contient un couple de fichiers CSV et je veux télécharger toujours le dernier, peu importe le nom qu'il a. – user3080315

+0

Dernière version, pas la dernière version d'un fichier particulier? ou le dernier fichier ajouté? – Ashan

+0

Le dernier fichier ajouté. – user3080315

2

Variation de la réponse I prévue pour: Boto3 S3, sort bucket by last modified. Vous pouvez modifier le code en fonction de vos besoins.

get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s')) 

s3 = boto3.client('s3') 
objs = s3.list_objects_v2(Bucket='my_bucket')['Contents'] 
last_added = [obj['Key'] for obj in sorted(objs, key=get_last_modified)][0] 

Si vous voulez inverser le tri:

[obj['Key'] for obj in sorted(objs, key=get_last_modified, reverse=True)][0] 
+0

Merci. J'ai ajouté ma configuration au client et édité le nom de mes buckets mais j'ai l'erreur suivante: get_last_modified = lambda obj: int (obj ['LastModified']. Strftime ('% s')) ValueError: chaîne de format invalide – user3080315

+0

Utilisez-vous 'Python 2.7' ou' Python 3'? – helloV

+0

J'utilise 3.6.1. – user3080315

0

C'est essentiellement la même réponse que helloV dans le cas où vous utilisez Session que je fais.

from boto3.session import Session 
import settings 

session = Session(aws_access_key_id=settings.AWS_ACCESS_KEY_ID, 
          aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY) 
s3 = session.resource("s3") 

get_last_modified = lambda obj: int(obj.last_modified.strftime('%s')) 


bckt = s3.Bucket("my_bucket") 
objs = [obj for obj in bckt.objects.all()] 

objs = [obj for obj in sorted(objs, key=get_last_modified)] 
last_added = objs[-1].key 

Avoir objs vous permet de triés supprimer rapidement tous les fichiers, mais le dernier avec

for obj in objs[:-1]: 
    s3.Object("my_bucket", obj.key).delete()