Verwenden Sie in Boto 3 "list_objects ()", um die Schlüssel abzurufen, die sich in S3 Buckets befinden. Sie können auch ein Präfix angeben, um die Bedingungen einzugrenzen. Ich denke, es ist eine häufig verwendete Methode, um den Schlüssel in S3 zu erhalten.
Wenn Sie beispielsweise alle Schlüssel mit dem Präfix "xx / yy" im Bucket-Namen "hoge-Bucket" erhalten möchten, gehen Sie wie folgt vor.
sample1.py
from boto3 import Session
s3client = Session().client('s3')
response = s3client.list_objects(
Bucket='hoge-bucket',
Prefix='xx/yy/'
)
if 'Contents' in response: #Wenn es keinen entsprechenden Schlüssel gibt, wird die Antwort'Contents'Ist nicht enthalten
keys = [content['Key'] for content in response['Contents']]
Wenn es nun einen Schlüssel mit der durch das Präfix angegebenen Bedingung gibt, sind die Schlüssel
>>> keys
['xx/yy/a1', 'xx/yy/a2', 'xx/yy/a3', 'xx/yy/b1']
Ein Array von Schlüsselzeichenfolgen sollte wie in zugewiesen werden.
Das Präfix kann übrigens auch als "xx / yy / a" angegeben werden. In diesem Fall wird das folgende Ergebnis zurückgegeben.
>>> keys
['xx/yy/a1', 'xx/yy/a2', 'xx/yy/a3']
list_objects ()
(um genau zu sein die Amazon S3-API) hat ein Limit von 1000 Schlüsseln, die gleichzeitig abgerufen werden können. Wenn Sie einfach alle 1000 oder mehr Schlüssel unter den Eimer bekommen möchten,
sample2.py
from boto3 import Session
s3res = Session().resource('s3')
bucket = s3res.Bucket('hoge-bucket')
keys = [obj.key for obj in bucket.objects.all()]
Wird in Ordnung sein.
Aber was ist, wenn Sie das Präfix angeben möchten? In sample1.py, das oben erwähnt wurde, sind den Schlüsseln höchstens 1000 Schlüssel zugewiesen. Selbst wenn Sie "1000000" für MaxKeys als Argument angeben, werden 1000 oder mehr nicht durch Angabe zurückgegeben.
Wenn sich unter "Hoge-Bucket" nur wenige Schlüssel befinden, können Sie Folgendes tun.
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/")]
Wenn Sie jedoch Zehntausende oder Hunderttausende von Schlüsseln haben, dauert es einige Zeit, bis Ergebnisse erzielt werden. Ich möchte den Teil, der mit dem Modell ausgeführt werden kann, so weit wie möglich dem Modell überlassen.
Der Rückgabewert von list_objects ()
ist ein Hash der Form:
{
'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',
'Delimiter': 'string',
'MaxKeys': 123,
'CommonPrefixes': [
{
'Prefix': 'string'
},
],
'EncodingType': 'url'
}
Das Wichtigste hier ist "IsTruncated". Wenn es mehr als 1000 Ergebnisse gibt, aber nur 1000 zurückgegeben werden, ist dieses "IsTruncated" "True". Übrigens ist das Array "Inhalt" immer in aufsteigender Reihenfolge angeordnet, basierend auf der alphabetischen Reihenfolge von "Schlüssel".
Außerdem hat "list_objects ()" ein Argument namens "Marker", und das Ergebnis kann mit dem angegebenen Schlüssel als erstem Element ausgegeben werden. Die Schauspieler sind jetzt fertig. Das Folgende ist eine Funktion, die durch Umschließen von "list_objects ()" erstellt wurde, um alle angegebenen Schlüssel unabhängig von der Anzahl der Fälle abzurufen.
sample4.py
from boto3 import Session
s3client = Session().client('s3')
def get_all_keys(bucket: str='', prefix: str='', keys: []=[], marker: str='') -> [str]:
"""
Gibt ein Array aller Schlüssel mit dem angegebenen Präfix zurück
"""
response = s3client.list_objects(Bucket=bucket, Prefix=prefix, Marker=marker)
if 'Contents' in response: #Wenn es keinen entsprechenden Schlüssel gibt, wird die Antwort'Contents'Ist nicht enthalten
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
In if'IsTruncated 'als Antwort:
, wenn IsTruncated
, rufen Sie sich mit dem Butt Butt (keys [-1]
) als Marker auf. Wenn die Antwort keinen Inhalt enthält oder nicht mehr IsTruncated ist, wird das Ergebnis sofort zurückgegeben.
Jetzt können Sie den Schlüssel auf S3 erhalten, ohne sich um die Nummer kümmern zu müssen!
Recommended Posts