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?
Une façon de voir le contenu serait:
for my_bucket_object in my_bucket.objects.all():
print(my_bucket_object)
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'])
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)
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)
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
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.
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))
ObjectSummary:
Deux identificateurs sont associés à 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:
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()
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