2017-12-07 2 views
0

Also, bevor jemand mir über die flache Struktur von S3 erzählt, weiß ich bereits, aber die Tatsache ist, Sie können 'Ordner' in S3 erstellen. Mein Ziel mit diesem Python-Code ist es, einen neuen Ordner zu erstellen, der das Datum des Laufens nennt und die Eingabe des Benutzers an diese anfügt (was die createS3Folder-Funktion ist) - Ich möchte dann einen Ordner in einem lokalen Verzeichnis mit diesem Ordner synchronisieren.Boto3 Ordner Sync unter neuen S3 'Ordner'

Das Problem ist, dass meine upload_files Funktion erstellt einen neuen Ordner in S3, die genau die Ordnerstruktur meiner lokalen Einrichtung emuliert.

Kann jemand vorschlagen, wie ich nur den Ordner in den neu erstellten synchronisieren würde, ohne Namen zu ändern?

import sys 
import boto3 
import datetime 
import os 

teamName = raw_input("Please enter the name of your project: ") 
bucketFolderName = "" 

def createS3Folder(): 
    date = datetime.date.today().strftime("%Y") + "." + 
    datetime.date.today().strftime("%B") + "." + 
    datetime.date.today().strftime("%d") 
    date1 = datetime.date.today() 
    date = str(date1) + "/" #In order to generate a file, you must 
    put "/" at the end of key 
    bucketFolderName = date + teamName + "/" 
    client = boto3.client('s3') 
    client.put_object(Bucket='MY_BUCKET',Key=bucketFolderName) 
    upload_files('/Users/local/directory/to/sync') 

def upload_files(path): 
    session = boto3.Session() 
    s3 = session.resource('s3') 
    bucket = s3.Bucket('MY_BUCKET') 
    for subdir, dirs, files in os.walk(path): 
     for file in files: 
      full_path = os.path.join(subdir, file) 
      with open(full_path, 'rb') as data: 
       bucket.put_object(Key=bucketFolderName, Body=data) 

def main(): 
    createS3Folder() 

if __name__ == "__main__": 
    main() 

Antwort

1

Ihre upload_files() Funktion ist das Hochladen auf:

bucket.put_object(Key=bucketFolderName, Body=data) 

Dies bedeutet, dass der Dateiname ("Key") auf S3 wird der Name des 'Ordner' sein. Es sollte sein:

bucket.put_object(Key=bucketFolderName + '/' + file, Body=data) 

Der Schlüssel ist der vollständige Pfad des Zielobjekts, einschließlich dem Dateinamen (und nicht nur ein Verzeichnis ').

In der Tat ist es nicht notwendig, den 'Ordner' vorher zu erstellen - einfach auf den gewünschten Key hochladen.

Wenn Sie sich faul fühlen, verwenden Sie den Befehl AWS Command-Line Interface (CLI)aws s3 sync, um es für Sie zu tun!

1

"die Tatsache ist, dass Sie 'Ordner' in S3 erstellen"

Nein, können Sie nicht.

Sie können ein leeres Objekt erstellen, das wie ein Ordner in der Konsole aussieht, aber es ist immer noch kein Ordner, es hat immer noch keine Bedeutung, es ist immer noch nicht notwendig, und wenn Sie es über die API löschen, alle Dateien Sie dachten, dass "in" der Ordner immer noch im Eimer sein wird. (Wenn Sie es aus der Konsole löschen, werden alle Inhalte aus dem Bucket gelöscht, da die Konsole jedes Objekt explizit mit diesem Schlüssel-Präfix löscht.)

Der Ordner, den Sie erstellen, ist kein Container und kann nichts enthalten es, weil S3 keine Ordner hat, die Container sind.

Wenn ich eine Datei cat.png speichern und so aussehen lassen möchte, als befände sie sich im Ordner hat/, setze einfach den Objektschlüssel auf hat/cat.png. Dies hat genau den gleichen Effekt wie in der Konsole, ob der Ordner hat/ explizit erstellt wurde oder nicht.

Um so was Sie wollen, erstellen Sie einfach den gewünschten Objektschlüssel für jedes Objekt mit String-Manipulation, einschließlich Ihrer gemeinsamen Präfix ("Ordnername") und / Trennzeichen. Jede Ordnerstruktur, die die Trennzeichen / beinhalten, wird in der Konsole angezeigt.

+0

Ich bin voll mit AWS vertraut, und ich verstehe die Idee der S3-Buckets vollständig.Während ich weiß, dass es sich um Objekte handelt (jede Vertrautheit mit der CLI und Boto3 würde dies selbst Anfängern in AWS klar machen), funktionieren diese konzeptionell als Ordner, daher der Begriff "Begrenzer": Ein Begrenzer ist eine Folge von einem oder mehreren Zeichen Wird verwendet, um die Grenze zwischen separaten, unabhängigen Regionen im Klartext oder anderen Datenströmen anzugeben. Ein Beispiel für ein Trennzeichen ist das Kommazeichen, das als Feldtrennzeichen in einer Folge von durch Kommas getrennten Werten fungiert. – BitLord

+0

Abgesehen davon, dass dieses Konzept für Menschen schwer zu fassen ist. Ordner existieren in S3 nicht auf die gleiche Weise wie Ordner in einem Dateisystem. Tun Sie dies: 1) Erstellen Sie einen Ordner namens TEST/2) Laden Sie eine Datei mit diesem Pfad TEST/TESTFILE.TXT 3) Benennen Sie das Objekt TEST/in OTHER/um. Jetzt beachten Sie, dass Sie zwei Ordner "TEST /" und "OTHER /" mit der Datei TESTFILE.TXT jetzt in "OTHER /" befindet. Die meisten Leute erwarten, dass das Umbenennen des Verzeichnisses auch die untergeordneten Dateien mit in übernimmt. –

Verwandte Themen