Boto3 S3: Dateien ohne Ordner
Mit boto3, wie kann ich alle Dateien abrufen, die in meinem S3-bucket, ohne das abrufen der Ordner?
Betrachten Sie die folgende Datei-Struktur:
file_1.txt
folder_1/
file_2.txt
file_3.txt
folder_2/
folder_3/
file_4.txt
In diesem Beispiel nur Im Interesse der 4 Dateien.
EDIT:
Einer manuellen Lösung ist:
def count_files_in_folder(prefix):
total = 0
keys = s3_client.list_objects(Bucket=bucket_name, Prefix=prefix)
for key in keys['Contents']:
if key['Key'][-1:] != '/':
total += 1
return total
In diesem Fall insgesamt 4.
Wenn ich nur
count = len(s3_client.list_objects(Bucket=bucket_name, Prefix=prefix))
wäre das Ergebnis 7 Objekte (4 Dateien und 3 Ordner):
file.txt
folder_1/
folder_1/file_2.txt
folder_1/file_3.txt
folder_1/folder_2/
folder_1/folder_2/folder_3/
folder_1/folder_2/folder_3/file_4.txt
Ich will einfach NUR:
file.txt
folder_1/file_2.txt
folder_1/file_3.txt
folder_1/folder_2/folder_3/file_4.txt
InformationsquelleAutor Vingtoft | 2017-03-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
S3 ist ein OBJEKT SPEICHERN. Es speichert KEINE Datei/Objekt-unter-Verzeichnisse Baum.
Der neue Anbieter immer verwirren die "Ordner" - option gegeben, die von Ihnen, die in der Tat eine willkürliche Präfix für das Objekt.
Objekt
PREFIX
ist ein Weg, um das abrufen von Objekt-organisiert von vordefinierten fix-Datei-name(Schlüssel) Präfix-Struktur, zB .Können Sie sich vorstellen, mit einem Dateisystem, das nicht ermöglichen es Ihnen, ein Verzeichnis zu erstellen, sondern ermöglichen es Ihnen, erstellen Sie die Datei Namen mit einem Schrägstrich "/" oder backslash "\" als Trennzeichen, und Sie bezeichnen die "Ebene" der Datei, die durch einen gemeinsamen Präfix.
Somit im S3 verwenden, können Sie folgenden "simulieren Verzeichnis" ist kein Verzeichnis.
Wie Sie sehen können, werden die Objekt-Namen können-store innerhalb des S3-unabhängig davon, welche Art von beliebigem Ordner-Trennzeichen(delimiter) verwenden Sie.
Jedoch, um zu helfen, Benutzer zu machen, Massen-file-transfer, S3, tools wie aws cli, s3_transfer api bemühen um eine Vereinfachung der Schritt und erstellen Objektnamen Folgen Sie Ihrem Eingangs-lokale Ordner-Struktur.
Also, wenn Sie sicher sind, dass alle S3-Objekt ist mit
/
oder\
als Trennzeichen verwenden , können Sie tools wie S3transfer oder AWSCcli, um ein einfaches herunterladen, indem Sie mit der Taste Namen.Hier ist die quick-and-dirty-code mit dem Ressourcen-iterator. Mit s3.Ressource.Objekt.filter zurück-iterator, der nicht die gleichen 1000 keys limit list_objects()/list_objects_v2().
InformationsquelleAutor mootmoot
Gibt es keine Ordner in S3. Was Sie haben, ist vier Dateien mit den Namen:
Das sind die tatsächlichen Namen der Objekte in S3. Wenn das, was Sie wollen, ist zu Ende mit:
sitzen alle im selben Verzeichnis auf einem lokalen Dateisystem, die Sie benötigen würde, zu manipulieren, den Namen des Objekts zu entfernen, nur den Namen der Datei. So etwas wie dies funktionieren würde:
Die variable
file_name
würde dann enthalten'file_4.txt'
.Nein, es gibt keine Ordner in S3. Wenn Sie eine
ListObjects
API-Anforderung von dem Eimer, alles, was Sie sehen werden, sind die vier-Datei Namen oben aufgeführt sind. S3 ermöglicht Ihnen die Angabe der Trennzeichen ("/" standardmäßig) und es wird dann erlauben Ihnen die Navigation durch die Objekte, als ob es Ordner, aber es ist kein Objekt gespeichert in S3 steht für den Ordnerfolder1
. Es gibt keine Möglichkeit zu sagen, die S3-service zu senden Sie nur das Basis-Dateinamen. Sie müssten, um eine Liste aller Objekte und dann manipulieren Sie den Objekt-Namen zu extrahieren nur die Basis-Dateiname.Nein, sir, ein list_objects zurückkehren würde, 7-Objekte boto3.readthedocs.io/de/latest/Referenz/services/...
Sie konnte die
Prefix
parameter bei der Auflistung der Objekte in Ihrem Eimer, um es zu bekommen, um nur die Gegenstände zurückgeben, die innerhalb eines bestimmten virtuellen Ordner. Vielleicht würde das helfen? Wenn Sie an einemPrefix=folder_1/folder_2/folder_3/
wenn Sie die Liste der Objekte, S3 wird nur zurückfile_4.txt
.dies ist eine gute Antwort, aber es muss irgendeine Art von duplicate file name handling. Wenn
folder1/file.txt
undfolder2/file.txt
bestanden, wenn Sie Sie gespeichert haben beide an das gleiche lokale Verzeichnis ein, würden sich gegenseitig überschreiben.InformationsquelleAutor garnaat
Einen Weg heraus zu filtern Ordner ist, indem Sie das Ende des Charakter-Objekts, wenn Sie sicher sind, dass keine Dateien, die Ende in einer forward-slash:
InformationsquelleAutor btomtom5