Dans Boto 3, utilisez list_objects ()
pour obtenir les clés qui se trouvent sur les compartiments S3. Vous pouvez également spécifier un préfixe pour affiner les conditions. Je pense que c'est une méthode couramment utilisée pour obtenir la clé dans S3.
Par exemple, si vous souhaitez obtenir toutes les clés avec le préfixe: xx / yy
dans le nom du bucket: hoge-bucket
, procédez comme suit.
sample1.py
from boto3 import Session
s3client = Session().client('s3')
response = s3client.list_objects(
Bucket='hoge-bucket',
Prefix='xx/yy/'
)
if 'Contents' in response: #S'il n'y a pas de clé correspondante, la réponse sera'Contents'N'est pas inclu
keys = [content['Key'] for content in response['Contents']]
Maintenant, s'il y a une clé de la condition spécifiée par Prefix, les clés seront
>>> keys
['xx/yy/a1', 'xx/yy/a2', 'xx/yy/a3', 'xx/yy/b1']
Un tableau de chaînes de clés doit être affecté comme dans.
En passant, Prefix peut également être spécifié comme `` xx / yy / a ''. Dans ce cas, le résultat suivant sera retourné.
>>> keys
['xx/yy/a1', 'xx/yy/a2', 'xx/yy/a3']
list_objects ()
(pour être exact, l'API Amazon S3) a une limite de 1000 clés qui peuvent être récupérées à la fois. Si vous souhaitez simplement obtenir les 1000 clés ou plus sous le seau,
sample2.py
from boto3 import Session
s3res = Session().resource('s3')
bucket = s3res.Bucket('hoge-bucket')
keys = [obj.key for obj in bucket.objects.all()]
Sera bien.
Mais que faire si vous souhaitez spécifier un préfixe? Dans sample1.py mentionné ci-dessus, au plus 1000 sont attribués aux clés. Même si vous spécifiez «1000000» pour MaxKeys comme argument, 1000 ou plus ne seront pas renvoyés par spécification.
S'il y a peu de clés sous hoge-bucket
, vous pouvez faire ce qui suit.
sample3.py
from boto3 import Session
s3res = Session().resource('s3')
bucket = s3res.Bucket('hoge-bucket')
keys = [obj.key for obj in bucket.objects.all() if obj.key.startswith("xx/yy/")]
Cependant, si vous avez des dizaines de milliers ou des centaines de milliers de clés, il faudra un temps considérable pour obtenir des résultats. Je veux laisser au modèle autant que possible la partie qui peut être réalisée avec le modèle.
Marker
avec list_objects ()
La valeur de retour de list_objects ()
est un hachage de la forme:
{
'IsTruncated': True|False, #Le résultat a-t-il été déchiqueté? Vrai si oui
'Marker': 'string',
'NextMarker': 'string',
'Contents': [
{
'Key': 'string',
'LastModified': datetime(2015, 1, 1),
'ETag': 'string',
'Size': 123,
'StorageClass': 'STANDARD'|'REDUCED_REDUNDANCY'|'GLACIER',
'Owner': {
'DisplayName': 'string',
'ID': 'string'
}
},
],
'Name': 'string',
'Prefix': 'string',
'Delimiter': 'string',
'MaxKeys': 123,
'CommonPrefixes': [
{
'Prefix': 'string'
},
],
'EncodingType': 'url'
}
La chose importante ici est ʻIsTruncated. S'il y a plus de 1000 résultats, mais que 1000 seulement sont renvoyés, ce ʻIsTruncated
devient True
. À propos, le tableau Contenu '' est toujours organisé par ordre croissant en fonction de l'ordre alphabétique de
Clé ''.
De plus, list_objects ()
a un argument appelé Marker
et le résultat peut être affiché avec la clé spécifiée comme premier élément. Les acteurs sont maintenant complets. Ce qui suit est une fonction créée en enveloppant list_objects ()
pour obtenir toutes les clés spécifiées quel que soit le nombre de cas.
sample4.py
from boto3 import Session
s3client = Session().client('s3')
def get_all_keys(bucket: str='', prefix: str='', keys: []=[], marker: str='') -> [str]:
"""
Renvoie un tableau de toutes les clés avec le préfixe spécifié
"""
response = s3client.list_objects(Bucket=bucket, Prefix=prefix, Marker=marker)
if 'Contents' in response: #S'il n'y a pas de clé correspondante, la réponse sera'Contents'N'est pas inclu
keys.extend([content['Key'] for content in response['Contents']])
if 'IsTruncated' in response:
return get_all_keys(bucket=bucket, prefix=prefix, keys=keys, marker=keys[-1])
return keys
ʻSi'IsTruncated 'en réponse: , et si ʻIsTruncated
, alors vous vous appelez avec le bout des touches (keys [-1]
) comme marqueur. S'il n'y a pas de contenu dans la réponse, ou si elle n'est plus IsTruncated, le résultat sera renvoyé immédiatement.
Vous pouvez maintenant obtenir la clé sur S3 sans vous soucier du nombre!
Recommended Posts