Abrufen Unterordner Namen im S3-bucket aus boto3
Mit boto3, ich kann auf meine AWS S3 bucket:
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
Nun, der Eimer enthält Ordner first-level
, die sich selbst enthält mehrere sub-Ordner mit einem Zeitstempel benannt, zum Beispiel 1456753904534
.
Ich muss wissen, den Namen dieser Unterordner für einen anderen job, den ich mache, und ich Frage mich, ob ich könnte haben boto3 abrufen für mich.
Also habe ich versucht:
objs = bucket.meta.client.list_objects(Bucket='my-bucket-name')
gibt ein Wörterbuch, dessen Schlüssel "Inhalt" gibt mir all die third-level-Dateien anstelle des second-level-Zeitstempel von Verzeichnissen, in der Tat habe ich eine Liste mit Dingen, wie
{u'ETag': '"etag"', u'Key': first-level/1456753904534/Teil-00014', u'LastModified':
datetime.datetime(2016, 2, 29, 13, 52, 24, tzinfo=tzutc()),
u'Owner': {u'DisplayName': 'owner', u 'ID':
'id'},
u'Size': Größe, u'StorageClass': 'storageclass'}
können Sie sehen, dass bestimmte Dateien, in diesem Fall part-00014
abgerufen werden, während ich mag würde, um den Namen des Verzeichnisses allein.
Im Prinzip könnte ich die Streifen aus dem directory-Namen aus allen Pfaden, aber es ist hässlich und teuer, zum abrufen von alles, was Sie an der Dritten Ebene auf die zweite Ebene!
Ich habe auch versucht etwas berichtet hier:
for o in bucket.objects.filter(Delimiter='/'):
print(o.key)
aber ich komme nicht auf den Ordner auf dem gewünschten Niveau.
Gibt es eine Möglichkeit, dies zu lösen?
Ich habe versucht, die ersten Zeilen, der link, den Sie schicken, die ich hier eingefügt, und ich bekomme den text-Dateien auf der ersten Ebene der Eimer und keine Ordner.
zinn Hast du jemals dieses Problem zu beheben. Ich stehe vor einem ähnlichen dilemma, wo ich das erste element in jeden Eimer Unterordner.
Ja, kein anderer Weg, als sich alle Objekte und die Aufteilung von
/
zu bekommen Unterordnermar tin Die einzige Möglichkeit, die ich gemacht habe, ist genommen die Ausgabe, geworfen in ein text-format und Komma begrenzen, die durch " /" und dann kopieren und einfügen erstes element. Was für ein Schmerz in den Arsch.
InformationsquelleAutor mar tin | 2016-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
S3 ist ein object storage, ist es nicht real directory-Struktur. Der "/" ist eher Kosmetik.
Ein Grund dafür, dass die Menschen wollen, um eine Verzeichnis-Struktur, denn Sie können sich pflegen/beschneiden/hinzufügen einen Baum, um die Anwendung. Für S3, behandeln Sie diese Struktur als eine Art index oder suchen, tag.
Manipulieren Objekt in S3, die Sie benötigen, boto3.client oder boto3.Ressourcen, wie z.B.
Um eine Liste aller Objekt
http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects
In der Tat, wenn die s3-Objekt-name gespeichert ist, mit ' /" - Trennzeichen, die Sie verwenden können, python os.Pfad extrahieren-Funktion die Ordner-Präfix.
Einer Erinnerung über boto3 : boto3.Ressource ist eine schöne high-level-API. Es gibt vor-und Nachteile mit boto3.client vs boto3.Ressource. Wenn Sie entwickeln interne shared-library, mit boto3.die Ressource wird Ihnen ein blackbox-Ebene über die verwendeten Ressourcen.
ein fauler python-split und Holen die letzten Daten in der Liste z.B. filename = keyname.split("/")[-1]
os.Pfad.dirname(directory/path/and/filename.txt) und
file_name = os.path.basename(directory/path/and/filename.txt)
InformationsquelleAutor mootmoot
Unten Stück code gibt NUR den 'Unterordner' im 'Ordner' aus dem s3-bucket.
Weitere details finden Sie auf https://github.com/boto/boto3/issues/134
InformationsquelleAutor Dipankar
Es hat mich eine Menge Zeit, um herauszufinden, aber schließlich, hier ist ein einfacher Weg, um die Liste Inhalt eines Unterordners im S3-bucket mit boto3. Hoffe es hilft
sollte trotzdem funktionieren
mein Punkt ist, dass dies eine furchtbar ineffiziente Lösung. S3 ist gebaut, um Umgang mit beliebigen Trennzeichen in die Tasten. Zum Beispiel
'/'
. Dass wir Sie überspringen "Ordner" voller Objekte, ohne zu paginieren über Sie. Und dann, selbst wenn Sie bestehen auf einer vollen Auflistung (d.h. der 'recursive' entspricht in aws cli), dann müssen Sie paginators oder Sie Liste nur die ersten 1000 Objekte.InformationsquelleAutor itz-azhar
Kurze Antwort:
Verwenden
Delimiter='/'
. Dies vermeidet dabei ein Rekursives listing von Ihrem Eimer. Hier einige Antworten falsch schlagen vor, eine komplette Liste und mit einigen string-manipulation zum abrufen der Verzeichnis-Namen. Dies könnte schrecklich ineffizient. Denken Sie daran, dass S3 hat praktisch keine Begrenzung der Anzahl der Objekte einen Eimer enthalten kann. Also stellen Sie sich vor, dass zwischenbar/
undfoo/
Sie haben Billionen von Objekten: Sie würde warten, eine sehr lange Zeit, um['bar/', 'foo/']
.Verwenden
Paginators
. Aus dem gleichen Grund (S3 ist ein Ingenieur-Angleichung der Unendlichkeit), Sie muss Liste durch die Seiten, und vermeiden Sie die Speicherung der Liste in den Speicher. Stattdessen betrachten Sie Ihre "lister" als iterator vor, und Griff den Strom, den es produziert.Verwenden
boto3.client
, nichtboto3.Ressource
. Dieresource
version scheint nicht zu behandeln sowie dieDelimiter
option. Wenn Sie eine Ressource, sagenbucket = boto3.resource('s3').Bucket(name)
können Sie den entsprechenden client mit:bucket.meta.client
.Lange Antwort:
Folgende ist ein iterator, ich benutze für einfache Eimer (keine version handling).
Test:
Folgende ist hilfreich, um testen Sie das Verhalten der
paginator
undlist_objects
. Es schafft eine Reihe von Verzeichnissen und Dateien. Da die Seiten sind bis zu 1000 Einträge, verwenden wir ein Vielfaches für Verzeichnisse und Dateien.dirs
enthält nur Verzeichnisse (jeweils ein Objekt).mixed
enthält eine Mischung von dirs und Objekte, mit einem Verhältnis von 2 Objekten für jede dir (plus ein Objekt unter dir, natürlich; S3 speichert nur Objekte).Die resultierende Struktur ist:
Mit ein wenig verarzten den code oben für
s3list
zu prüfen die Antworten von derpaginator
ist, können Sie beobachten einige lustige Fakten:Den
Marker
ist wirklich exklusiv. AngesichtsMarker=topdir + 'mixed/0500_foo_a'
wird die Auflistung beginnen nach, der Schlüssel (wie in der AmazonS3 API), d.h., mit.../mixed/0500_foo_b
. Das ist der Grund für__prev_str()
.Mit
Delimiter
, bei der Auflistungmixed/
jede Antwort aus derpaginator
enthält 666 keys und 334 häufige Präfixe. Es ist ziemlich gut, nicht Gebäude enorme Reaktionen.Dagegen bei der Auflistung
dirs/
jede Antwort aus derpaginator
enthält die 1000 häufigsten Präfixe (und keine Tasten).Passieren einer Grenze in form von
PaginationConfig={'MaxItems': limit}
Grenzen, nur die Anzahl der Schlüssel, nicht die gemeinsame Präfixe. Wir beschäftigen uns mit, dass durch das weitere kürzen der stream von unseren iterator.es ist wirklich nicht sehr kompliziert, für ein system, das solche unglaublichen Maßstab und Zuverlässigkeit. Wenn Sie jemals sich mit mehr als ein paar hundert TBs, erhalten Sie eine Wertschätzung für das, was Sie anbieten. Denken Sie daran, die Laufwerke haben immer eine MTBF > 0... Denken über die Auswirkungen auf die large scale data storage. Disclaimer: ich bin eine aktive und glückliche AWS-Benutzer, die keine andere Verbindung, außer, dass ich gearbeitet habe petabyte-scale data seit 2007, und es verwendet zu sein viel härter.
es ist verrückt, zu kompliziert für den durchschnittlichen Benutzer.
InformationsquelleAutor Pierre D
Ich hatte das gleiche Problem, aber es geschafft, es zu beheben, mithilfe
boto3.client
undlist_objects_v2
mitBucket
undStartAfter
Parameter.Den Ausgang für den obigen code würde wie folgt Aussehen:
Boto3 list_objects_v2 Dokumentation
In Ordnung zu Streifen, nur den Namen des Verzeichnisses für
secondLevelFolder
habe ich nur verwendet, python-Methodesplit()
:Den Ausgang für den obigen code würde wie folgt Aussehen:
Python split () - Dokumentation
Wenn Sie möchten, um die Verzeichnis-Namen UND-Inhalte Einzelteil-name ersetzen Sie dann die print Zeile mit dem folgenden:
Und der folgenden wird ausgegeben:
Hoffe, das hilft
InformationsquelleAutor Sophie Muspratt
den neuesten BOTO3 Dokumentation empfiehlt jetzt mit list_objects_v2
http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2
InformationsquelleAutor Sameer Girolkar
Die große Erkenntnis mit dem S3 ist, dass es keine Ordner/Verzeichnisse nur Schlüssel. Die scheinbare Ordner-Struktur ist nur vorangestellt, um die mit dem Namen, werden die 'Schlüssel', also zum auflisten des Inhalts des
myBucket
'ssome/path/to/the/file/
können Sie versuchen:was würde Ihnen so etwas wie:
YEah, ich brauchte eine lange Zeit, um es herauszufinden (wie alles in AWS). Froh, dass es jemandem geholfen.
InformationsquelleAutor CpILL
Folgende Werke für mich... S3-Objekte:
Mit:
erhalten wir:
Mit:
erhalten wir:
InformationsquelleAutor cem
Den AWS-cli diese (vermutlich ohne abrufen und Durchlaufen alle Tasten im Eimer), wenn Sie Sie ausführen
aws s3 ls s3://my-bucket/
, so dass ich dachte, es muss einen Weg mit boto3.https://github.com/aws/aws-cli/blob/0fedc4c1b6a7aee13e2ed10c3ada778c702c22c3/awscli/customizations/s3/subcommands.py#L499
Sieht es aus wie Sie in der Tat mit Präfix-und Trennzeichen - ich war in der Lage, eine Funktion schreiben, die mir alle Verzeichnisse auf der root-Ebene von einem Eimer, indem geändert wird, der code ein wenig:
InformationsquelleAutor Paul Zielinski
Erstens, es gibt keine echten Ordner-Konzept in S3.
Sie können definitiv haben ein Datei @
'/folder/subfolder/myfile.txt'
und keine Ordner noch Unterordner.Zu "simulieren" einen Ordner in S3, müssen Sie erstellen eine leere Datei mit einem '/' am Ende des namens (siehe Amazon S3 boto - how, um einen Ordner zu erstellen?)
Für Ihr problem, sollten Sie wahrscheinlich verwenden Sie die Methode
get_all_keys
mit den 2 Parametern :prefix
unddelimiter
https://github.com/boto/boto/blob/develop/boto/s3/bucket.py#L427
Gerade überprüft boto 1.2 a: es, bucket hat eine Methode
list
mitprefix
unddelimiter
. Ich nehme an, es sollte funktionieren.Das Eimer-Objekt abgerufen wie poste ich in der Frage nicht auf diese Methoden. Ich bin auf boto3 1.2.6, welche version hat dein link verweist?
Siehe hier boto3.readthedocs.org/en/latest/reference/services/...
InformationsquelleAutor Pirheas