In Cloud Storage lesen und schreiben

In diesem Dokument wird beschrieben, wie Daten mithilfe der Cloud Storage-Clientbibliothek gespeichert und abgerufen werden. Es wird davon ausgegangen, dass Sie die unter Cloud Storage einrichten beschriebenen Aufgaben durchgeführt und somit einen Cloud Storage-Bucket aktiviert sowie die Clientbibliotheken heruntergeladen haben. Außerdem sollten Sie eine App Engine-Anwendung erstellen können.

Weitere Codebeispiele finden Sie unter Cloud Storage-Clientbibliotheken.

Erforderliche Importe

Verwenden Sie das folgende Code-Snippet für den Zugriff auf Cloud Storage mithilfe der Clientbibliothek:

# Imports the Google Cloud client library
from google.cloud import storage

# Instantiates a client
storage_client = storage.Client()

# The name for the new bucket
bucket_name = "my-new-bucket"

# Creates the new bucket
bucket = storage_client.create_bucket(bucket_name)

print(f"Bucket {bucket.name} created.")

Cloud Storage-Bucket angeben

Bevor Sie Vorgänge in Cloud Storage ausführen können, müssen Sie den Bucket-Namen angeben.

# Imports the Google Cloud client library
from google.cloud import storage

# Instantiates a client
storage_client = storage.Client()

# The name for the new bucket
bucket_name = "my-new-bucket"

# Creates the new bucket
bucket = storage_client.create_bucket(bucket_name)

print(f"Bucket {bucket.name} created.")

Am einfachsten ist es, einen Bucket-Namen anzugeben, indem Sie für Ihr Projekt den Standard-Bucket verwenden. Der Aufruf von get_default_gcs_bucket_name ist nur erfolgreich, wenn Sie den Standard-Bucket für Ihr Projekt erstellt haben.

Schreibvorgänge in Cloud Storage

Im folgenden Beispiel wird gezeigt, wie in den Bucket geschrieben wird:

from google.cloud import storage

def write_read(bucket_name, blob_name):
    """Write and read a blob from GCS using file-like IO"""
    # The ID of your GCS bucket
    # bucket_name = "your-bucket-name"

    # The ID of your new GCS object
    # blob_name = "storage-object-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    # Mode can be specified as wb/rb for bytes mode.
    # See: https://docs.python.org/3/library/io.html
    with blob.open("w") as f:
        f.write("Hello world")

    with blob.open("r") as f:
        print(f.read())

Wichtige Hinweise:

  • Im Aufruf zum Öffnen der Datei für das Schreiben werden im Beispiel bestimmte Cloud Storage-Header angegeben, die benutzerdefinierte Metadaten für die Datei festlegen. Diese Metadaten können mit cloudstorage.stat() abgerufen werden. Eine Liste der unterstützten Header finden Sie in der Referenz zu cloudstorage.open().

  • Der Header x-goog-acl ist nicht festgelegt. Das bedeutet, dass beim Schreiben in den Bucket die standardmäßige Cloud Storage-ACL für öffentlichen Lesezugriff auf das Objekt angewendet wird.

  • Achten Sie darauf, dass die Funktion aufgerufen wird, um die Datei nach Abschluss des Schreibvorgangs zu schließen. Ohne diesen Aufruf wird die Datei nicht in Cloud Storage geschrieben. Nach dem Aufrufen der Python-Dateifunktion close() können Sie die Datei nicht mehr anhängen. Wenn Sie eine Datei ändern möchten, müssen Sie die Python-Dateifunktion open() aufrufen, um die Datei im Schreibmodus noch einmal zu öffnen. Dadurch wird sie überschrieben und nicht angehängt.

Lesevorgänge in Cloud Storage

Im folgenden Beispiel wird gezeigt, wie eine Datei aus dem Bucket gelesen wird:

from google.cloud import storage

def write_read(bucket_name, blob_name):
    """Write and read a blob from GCS using file-like IO"""
    # The ID of your GCS bucket
    # bucket_name = "your-bucket-name"

    # The ID of your new GCS object
    # blob_name = "storage-object-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    # Mode can be specified as wb/rb for bytes mode.
    # See: https://docs.python.org/3/library/io.html
    with blob.open("w") as f:
        f.write("Hello world")

    with blob.open("r") as f:
        print(f.read())

In beiden Beispielen ist das Argument blob_name, das Sie an cloudstorage.open() übergeben, der Pfad zu Ihrer Datei im Format YOUR_BUCKET_NAME/PATH_IN_GCS. Beachten Sie, dass der Standardwert für cloudstorage.open() schreibgeschützt ist. Sie müssen beim Öffnen einer Datei für das Lesen keinen Modus angeben.

Bucket-Inhalt auflisten

Der Beispielcode zeigt, wie Sie durch einen Bucket mit Inhalten vom Typ blob blättern:

from google.cloud import storage

def list_blobs(bucket_name):
    """Lists all the blobs in the bucket."""
    # bucket_name = "your-bucket-name"

    storage_client = storage.Client()

    # Note: Client.list_blobs requires at least package version 1.17.0.
    blobs = storage_client.list_blobs(bucket_name)

    # Note: The call returns a response only when the iterator is consumed.
    for blob in blobs:
        print(blob.name)

Beachten Sie, dass der vollständige Dateiname als eine Zeichenfolge ohne Verzeichnistrennzeichen angezeigt wird. Wenn Sie die Datei mit der besser erkennbaren Verzeichnishierarchie darstellen möchten, legen Sie für den Parameter delimiter das gewünschte Verzeichnistrennzeichen fest.

Dateien in Cloud Storage löschen

Der folgende Code zeigt, wie Sie eine Datei aus Cloud Storage mit der Methode cloudstorage.delete() löschen (als gcs importiert).

from google.cloud import storage

def delete_blob(bucket_name, blob_name):
    """Deletes a blob from the bucket."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"

    storage_client = storage.Client()

    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)
    generation_match_precondition = None

    # Optional: set a generation-match precondition to avoid potential race conditions
    # and data corruptions. The request to delete is aborted if the object's
    # generation number does not match your precondition.
    blob.reload()  # Fetch blob metadata to use in generation_match_precondition.
    generation_match_precondition = blob.generation

    blob.delete(if_generation_match=generation_match_precondition)

    print(f"Blob {blob_name} deleted.")

In diesem Beispiel werden die Dateien bereinigt, die im Abschnitt Schreibvorgänge in Cloud Storage in den Bucket geschrieben wurden.

Weitere Informationen