[PYTHON] Comment obtenir la clé sur Amazon S3 avec Boto 3, exemple de mise en œuvre, notes

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.

Utilisation de base

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']

point important

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.

Pour obtenir 1000 clés ou plus avec la condition de préfixe

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.

Méthode 1: Obtenez tous les enregistrements une fois, puis filtrez

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.

Méthode 2: Utilisez 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

Comment obtenir la clé sur Amazon S3 avec Boto 3, exemple de mise en œuvre, notes
Comment publier un blog sur Amazon S3 avec le moteur de blog statique `` Pélican '' pour Pythonista
Autoencoder dans Chainer (Remarques sur l'utilisation de + trainer)
lire le tag qui vous est attribué dans ec2 avec boto3
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
Comment entrer dans l'environnement de développement Python avec Vagrant
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
[Introduction à Python] Comment obtenir des données avec la fonction listdir
POSTEZ l'image sélectionnée sur le site Web avec multipart / form-data et enregistrez-la sur Amazon S3! !!
Comment connaître le nombre de GPU de python ~ Remarques sur l'utilisation du multitraitement avec pytorch ~
Remarques sur l'utilisation de pywinauto
Comment obtenir la version Python
Remarques sur l'utilisation des featuretools
Comment démarrer avec Scrapy
Comment démarrer avec Python
Comment démarrer avec Django
Remarques sur la rédaction de requirements.txt
Utilisez boto3 pour accéder à S3
Comment est le progrès? Continuons le boom ?? en Python
Comment obtenir l'ID de Type2Tag NXP NTAG213 avec nfcpy
Comment obtenir le répertoire où se trouve le EXE construit avec Pyinstaller
Comment obtenir tout le trafic via VPN avec OpenVPN sous Linux
J'ai essayé de démarrer avec Bitcoin Systre le week-end
[Python] Explique comment utiliser la fonction format avec un exemple
[Python] Comment obtenir une valeur avec une clé autre que value avec Enum
Notes d'étape pour démarrer avec django
Comment obtenir l'identifiant du parent avec sqlalchemy
Procédure pour obtenir la clé KeePassX avec une ligne de commande sous OSX
[Python] Explique comment utiliser la fonction range avec un exemple concret
Comment obtenir la différence de date et d'heure en secondes avec Python
Comment mettre à jour PHP sur Amazon Linux 2
Comment gérer l'erreur SSL lors de la connexion à S3 avec Python boto
Essayez le chiffrement côté serveur de S3 à l'aide de boto3
Comment obtenir une sortie colorée sur la console
Comment attraper l'erreur de clé boto3 S3 NoSuch
Obtenez des taux de change réguliers avec Heroku et téléchargez des journaux sur Amazon S3
Copier des données d'Amazon S3 vers Google Cloud Storage avec Python (boto)
Changer la clé de l'objet sur S3 du format de date normal au format Hive
[Python] Comment enregistrer des images sur le Web à la fois avec Beautiful Soup
Liste de contrôle pour éviter de transformer les éléments de array of numpy avec for
Remarque: Comment obtenir le dernier jour du mois avec python (ajouté le premier jour du mois)
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Le moyen le plus simple de démarrer avec Django
Stratégie sur la façon de monétiser avec Python Java
Comment essayer l'algorithme des amis d'amis avec pyfof
Comment installer OpenGM sur OSX avec macports
Introduction à Python avec Atom (en route)
Comment obtenir les fichiers dans le dossier [Python]
Comment entraîner Kaldi avec JUST Corpus
Comment définir un dossier partagé avec le système d'exploitation hôte dans CentOS7 sur Virtual BOX
Comment démarrer avec Visual Studio Online ~ La fin de l'ère de la construction d'environnement ~
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Comment obtenir le nom de la variable lui-même en python
Réfléchissez à la programmation de Python sur votre iPad
Comment supprimer la chaîne de caractères spécifiée avec la commande sed! !! !!