In Boto 3 gibt es keine Methode, die "exist ()" entspricht und die Existenz eines Schlüssels bis zum Zeitpunkt von Boto 2 bestätigt. Eine ähnliche Funktion kann jedoch erreicht werden, indem list_objects ()
verwendet wird, wie unten gezeigt.
exists.py
from boto3 import Session
s3client = Session().client('s3')
def exists(bucket: str, key: str) -> bool:
"""
Existiert der angegebene Schlüssel im angegebenen Bucket?
: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 ()
gibt einen Hash der Form zurück:
{
'IsTruncated': True|False, #Wurde das Ergebnis geschreddert? Richtig wenn ja
'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',
<Ausgelassen>
}
"Inhalt" ist der Schlüssel, und dies ist die Reihenfolge der entsprechenden Schlüssel. Wenn kein entsprechender Schlüssel vorhanden ist, wird "Inhalt" nicht in den Rückgabewert aufgenommen. Überprüfen Sie daher, ob "Inhalt" enthalten ist und ob der Wert von "Schlüssel" im Wörterbuch in der Liste mit dem als Argument angegebenen "Schlüssel" übereinstimmt. Dies entspricht "existiert ()". Sie können die Funktion reproduzieren.
Vollständiger Pfad des Schlüssels zum Präfix? Es fühlt sich etwas seltsam an, etwas zu spezifizieren, aber ich verstehe, dass Präfix so etwas ist.
In den folgenden Fällen hat es nicht richtig funktioniert, also habe ich es behoben (thx, @masahiro_toriumi)
Präfix gibt nur das Präfix des Schlüssels an. Wenn Sie beispielsweise list_object mit dem Präfix "MyBucket / aaa.txt" aufrufen, wird es auch in "MyBucket / aaa.txt.bak" abgefangen, also "MyBucket /" Ich kann nicht genau sagen, ob der Schlüssel "aaa.txt" existiert