web-dev-qa-db-fra.com

Contenu de la liste d'un seau avec boto3

Comment voir ce qu'il y a dans un seau dans S3 avec boto3? (c'est-à-dire faire un "ls")?

Faire ce qui suit:

import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('some/path/')

résultats:

s3.Bucket(name='some/path/')

Comment puis-je voir son contenu?

133

Une façon de voir le contenu serait:

for my_bucket_object in my_bucket.objects.all():
    print(my_bucket_object)
172
garnaat

Cela ressemble à un "ls" mais cela ne prend pas en compte la convention de préfixe des dossiers et listera les objets dans le compartiment. Il appartient au lecteur de filtrer les préfixes qui font partie du nom de la clé.

Dans Python 2:

from boto.s3.connection import S3Connection

conn = S3Connection() # assumes boto.cfg setup
bucket = conn.get_bucket('bucket_name')
for obj in bucket.get_all_keys():
    print(obj.key)

Dans Python 3:

from boto3 import client

conn = client('s3')  # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='bucket_name')['Contents']:
    print(key['Key'])
80
cgseller

Je suppose que vous avez configuré l'authentification séparément.

import boto3
s3 = boto3.resource('s3')

my_bucket = s3.Bucket('bucket_name')

for file in my_bucket.objects.all():
    print(file.key)
29
Tushar Niras

Si vous voulez passer les clés ACCESS et SECRET (ce que vous ne devriez pas faire, car ce n’est pas sécurisé):

from boto3.session import Session

ACCESS_KEY='your_access_key'
SECRET_KEY='your_secret_key'

session = Session(aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('your_bucket')

for s3_file in your_bucket.objects.all():
    print(s3_file.key)
22
Erwin Alberto

Afin de gérer des listes de clés volumineuses (lorsque la liste de répertoires est supérieure à 1000 éléments), j’ai utilisé le code suivant pour accumuler les valeurs de clé (noms de fichiers) avec plusieurs listes (grâce à Amelio ci-dessus pour les premières lignes). Le code est pour python3:

    from boto3  import client
    bucket_name = "my_bucket"
    prefix      = "my_key/sub_key/lots_o_files"

    s3_conn   = client('s3')  # type: BaseClient  ## again assumes boto.cfg setup, assume AWS S3
    s3_result =  s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter = "/")

    if 'Contents' not in s3_result:
        #print(s3_result)
        return []

    file_list = []
    for key in s3_result['Contents']:
        file_list.append(key['Key'])
    print(f"List count = {len(file_list)}")

    while s3_result['IsTruncated']:
        continuation_key = s3_result['NextContinuationToken']
        s3_result = s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter="/", ContinuationToken=continuation_key)
        for key in s3_result['Contents']:
            file_list.append(key['Key'])
        print(f"List count = {len(file_list)}")
    return file_list
17
Hephaestus

Ma fonction utilitaire s3 keys est essentiellement une version optimisée de la réponse de @ Hephaestus:

import boto3


s3_paginator = boto3.client('s3').get_paginator('list_objects_v2')


def keys(bucket_name, prefix='/', delimiter='/', start_after=''):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    start_after = (start_after or prefix) if prefix.endswith(delimiter) else start_after
    for page in s3_paginator.paginate(Bucket=bucket_name, Prefix=prefix, StartAfter=start_after):
        for content in page.get('Contents', ()):
            yield content['Key']

Dans mes tests (boto3 1.9.84), c'est nettement plus rapide que le code équivalent (mais plus simple):

import boto3


def keys(bucket_name, prefix='/', delimiter='/'):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    bucket = boto3.resource('s3').Bucket(bucket_name)
    return (_.key for _ in bucket.objects.filter(Prefix=prefix))

Comme S3 garantit les résultats triés binaires UTF-8 , une optimisation start_after a été ajoutée à la première fonction.

7
Sean Summers

De manière plus parcimonieuse, au lieu d’itérer via une boucle for, vous pouvez simplement imprimer l’objet original contenant tous les fichiers de votre compartiment S3:

session = Session(aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key)
s3 = session.resource('s3')
bucket = s3.Bucket('bucket_name')

files_in_s3 = bucket.objects.all() 
#you can print this iterable with print(list(files_in_s3))
5
Daniel Vieira

ObjectSummary:

Deux identificateurs sont associés à ObjectSummary:

  • nom_base
  • clé

boto3 S3: ObjectSummary

Plus d'informations sur les clés d'objet de la documentation AWS S3:

Clés de l'objet:

Lorsque vous créez un objet, vous spécifiez le nom de la clé, qui l'identifie de manière unique dans le compartiment. Par exemple, dans la console Amazon S3 (voir AWS Management Console), lorsque vous mettez un compartiment en surbrillance, une liste des objets de votre compartiment apparaît. Ces noms sont les clés d'objet. Le nom d'une clé est une séquence de caractères Unicode dont le codage UTF-8 a une longueur maximale de 1024 octets.

Le modèle de données Amazon S3 est une structure plate: vous créez un compartiment et ce dernier stocke des objets. Il n’existe pas de hiérarchie de sous-ensembles ni de sous-dossiers; Toutefois, vous pouvez déduire la hiérarchie logique à l'aide des préfixes et des délimiteurs de nom de clé, comme le fait la console Amazon S3. La console Amazon S3 prend en charge un concept de dossiers. Supposons que votre compartiment (créé par l’administrateur) comporte quatre objets avec les clés d’objet suivantes:

Développement/Projects1.xls

Finance/statement1.pdf

Private/taxdocument.pdf

s3-dg.pdf

Référence:

AWS S3: clés d'objet

Voici un exemple de code qui montre comment obtenir le nom du compartiment et la clé d'objet.

Exemple:

import boto3
from pprint import pprint

def main():

    def enumerate_s3():
        s3 = boto3.resource('s3')
        for bucket in s3.buckets.all():
             print("Name: {}".format(bucket.name))
             print("Creation Date: {}".format(bucket.creation_date))
             for object in bucket.objects.all():
                 print("Object: {}".format(object))
                 print("Object bucket_name: {}".format(object.bucket_name))
                 print("Object key: {}".format(object.key))

    enumerate_s3()


if __== '__main__':
    main()
3
Gothburz

Je viens de le faire comme ça, y compris la méthode d'authentification:

s3_client = boto3.client(
                's3',
                aws_access_key_id='access_key',
                aws_secret_access_key='access_key_secret',
                config=boto3.session.Config(signature_version='s3v4'),
                region_name='region'
            )

response = s3_client.list_objects(Bucket='bucket_name', Prefix=key)
if ('Contents' in response):
    # Object / key exists!
    return True
else:
    # Object / key DOES NOT exist!
    return False
1
Milean