Dans Boto 3, il n'y a pas de méthode équivalente à ʻexists () qui confirme l'existence de la clé jusqu'au moment de Boto 2. Cependant, une fonction similaire peut être réalisée en utilisant
list_objects ()` comme indiqué ci-dessous.
exists.py
from boto3 import Session
s3client = Session().client('s3')
def exists(bucket: str, key: str) -> bool:
"""
La clé spécifiée existe-t-elle dans le compartiment spécifié?
:param bucket: (str) bucket name
:param key: (str) key
:return: (bool)
"""
contents = s3client.list_objects(Prefix=key, Bucket=bucket).get("Contents")
if contents:
for content in contents:
if content.get("Key") == key:
return True
return False
list_objects ()
retourne 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',
<Omis>
}
Contenu '' est la clé, et c'est la séquence des touches correspondantes. S'il n'y a pas de clé correspondante,
Contenu '' ne sera pas inclus dans la valeur de retour. Par conséquent, vérifiez si «Contenu» est inclus, et si la valeur de «Clé» dans le dictionnaire de la liste correspond à la «clé» donnée en argument, cela correspond à «existe ()». Vous pouvez reproduire la fonction.
Chemin complet de la clé vers Prefix
? Cela semble un peu étrange à spécifier, mais je comprends que Prefix est une telle chose.
Cela ne fonctionnait pas correctement dans les cas suivants, donc je l'ai corrigé (thx, @masahiro_toriumi)
Prefix spécifie uniquement le préfixe de la clé, donc par exemple, si vous appelez list_object avec le préfixe "MyBucket / aaa.txt", il sera également pris dans "MyBucket / aaa.txt.bak", donc "MyBucket / Je ne peux pas dire exactement si la clé "aaa.txt" existe
Recommended Posts