[PYTHON] Hinweise zum Implementieren des Schlüssels unter Amazon S3 mit Boto 3, Implementierungsbeispiel, Hinweise

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.

Grundlegende Verwendung

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

wichtiger Punkt

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.

Um 1000 oder mehr Schlüssel mit Präfixbedingung zu erhalten

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.

Methode 1: Alle Datensätze einmal abrufen und dann filtern

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.

Methode 2: Verwenden Sie "Marker" mit "list_objects ()"

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

Hinweise zum Implementieren des Schlüssels unter Amazon S3 mit Boto 3, Implementierungsbeispiel, Hinweise
So veröffentlichen Sie ein Blog auf Amazon S3 mit der statischen Blog-Engine "Pelican" für Pythonista
Autoencoder im Chainer (Hinweise zur Verwendung von + Trainer)
Lesen Sie das Tag, das Ihnen in ec2 mit boto3 zugewiesen wurde
[Hyperledger Iroha] Hinweise zur Verwendung des Python SDK
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung
Hinweise zur Verwendung von Marshmallow in der Schemabibliothek
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
POST das ausgewählte Bild auf der Website mit mehrteiligen / Formulardaten und speichere es in Amazon S3! !!
Wie man die Anzahl der GPUs aus Python kennt ~ Hinweise zur Verwendung von Multiprocessing mit pytorch ~
Hinweise zur Verwendung von Pywinauto
So erhalten Sie die Python-Version
Hinweise zur Verwendung von featuretools
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Wie fange ich mit Django an?
Hinweise zum Schreiben von require.txt
Verwenden Sie boto3, um zu S3 zu gelangen
Wie ist der Fortschritt? Lassen Sie uns mit dem Boom in Python weitermachen
So erhalten Sie die ID von Type2Tag NXP NTAG213 mit nfcpy
So erhalten Sie das Verzeichnis, in dem die mit Pyinstaller erstellte EXE-Datei vorhanden ist
So erhalten Sie den gesamten Datenverkehr über VPN mit OpenVPN unter Linux
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
[Python] Erklärt anhand eines Beispiels, wie die Formatierungsfunktion verwendet wird
[Python] So erhalten Sie mit Enum einen Wert mit einem anderen Schlüssel als dem Wert
Schritt Notizen, um mit Django zu beginnen
So erhalten Sie die Eltern-ID mit sqlalchemy
Vorgehensweise zum Abrufen des KeePassX-Schlüssels mit einer Befehlszeile unter OSX
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
So aktualisieren Sie PHP unter Amazon Linux 2
Umgang mit SSL-Fehlern beim Herstellen einer Verbindung zu S3 mit Python boto
Versuchen Sie die serverseitige Verschlüsselung von S3 mit boto3
So erhalten Sie eine farbige Ausgabe an die Konsole
So fangen Sie den Boto3 S3 NoSuch Key-Fehler ab
Erhalten Sie regelmäßige Wechselkurse mit Heroku und laden Sie Protokolle zu Amazon S3 hoch
Kopieren Sie Daten von Amazon S3 mit Python (boto) in Google Cloud Storage.
Ändern Sie den Objektschlüssel in S3 vom normalen Datumsformat in das Hive-Format
[Python] So speichern Sie Bilder mit Beautiful Soup sofort im Web
Checkliste, wie Sie vermeiden können, die Elemente des Numpy-Arrays mit for zu drehen
Hinweis: So erhalten Sie den letzten Tag des Monats mit Python (hinzugefügt am ersten Tag des Monats)
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Der einfachste Weg, um mit Django zu beginnen
Strategie zur Monetarisierung mit Python Java
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
So installieren Sie OpenGM unter OSX mit Macports
Einführung in Python mit Atom (unterwegs)
So erhalten Sie die Dateien im Ordner [Python]
Wie man Kaldi mit JUST Corpus trainiert
So legen Sie einen freigegebenen Ordner mit dem Host-Betriebssystem in CentOS7 auf Virtual BOX fest
Erste Schritte mit Visual Studio Online ~ Das Ende der Ära der Umgebungskonstruktion ~
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
So erhalten Sie den Variablennamen selbst in Python
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
So löschen Sie die angegebene Zeichenfolge mit dem Befehl sed! !! !!