Leer y escribir en Cloud Storage

En este documento se describe cómo almacenar y obtener datos mediante la biblioteca de cliente de Cloud Storage. Se da por hecho que has completado las tareas descritas en Configurar Cloud Storage para activar un segmento de Cloud Storage y descargar las bibliotecas de cliente. También se presupone que sabes cómo crear una aplicación de App Engine.

Para ver más ejemplos de código, consulta las bibliotecas de cliente de Cloud Storage .

Importaciones necesarias

Usa el siguiente fragmento de código para acceder a Cloud Storage con la biblioteca de cliente:

# 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.")

Especificar el segmento de Cloud Storage

Antes de realizar cualquier operación en Cloud Storage, debes proporcionar el nombre del segmento.

# 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.")

La forma más sencilla de especificar un nombre de segmento es usar el segmento predeterminado de tu proyecto. La llamada a get_default_gcs_bucket_name solo se realizará correctamente si has creado el cubo predeterminado de tu proyecto.

Escribir en Cloud Storage

En el siguiente ejemplo se muestra cómo escribir en el segmento:

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())

Ten en cuenta lo siguiente:

  • En la llamada para abrir el archivo de escritura, el ejemplo especifica ciertos encabezados de Cloud Storage que escriben metadatos personalizados para el archivo. Estos metadatos se pueden recuperar mediante cloudstorage.stat(). Puedes consultar la lista de encabezados admitidos en la referencia de cloudstorage.open().

  • No se ha definido el encabezado x-goog-acl. Esto significa que la LCA predeterminada de Cloud Storage lectura pública se aplicará al objeto cuando se escriba en el segmento.

  • Asegúrate de invocar la función para cerrar el archivo después de terminar la escritura. Si no lo haces, el archivo no se escribirá en Cloud Storage. Ten en cuenta que, después de llamar a la función del archivo de Python close(), no podrás añadir contenido al archivo. Si necesitas modificar un archivo, tendrás que llamar a la función de archivo de Python open() para volver a abrir el archivo en modo de escritura, que sobrescribe el archivo, no lo añade.

Leer desde Cloud Storage

En el siguiente ejemplo se muestra cómo leer un archivo completo del segmento:

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())

En ambos ejemplos, el argumento blob_name que se pasa a cloudstorage.open() es la ruta del archivo en formato YOUR_BUCKET_NAME/PATH_IN_GCS. Nota: El valor predeterminado de cloudstorage.open() es el modo de solo lectura. No es necesario especificar un modo al abrir un archivo para leerlo.

Mostrar el contenido de un segmento

En el código de ejemplo se muestra cómo paginar un contenedor con contenido de tipo blob :

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)

Ten en cuenta que el nombre de archivo completo se muestra como una cadena sin delimitadores de directorio. Si quieres mostrar el archivo con su jerarquía de directorios más reconocible, asigna al parámetro delimiter el delimitador de directorios que quieras usar.

Eliminar archivos de Cloud Storage

En el código siguiente se muestra cómo eliminar un archivo de Cloud Storage mediante el método cloudstorage.delete() (importado como gcs).

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.")

En este ejemplo, se eliminan los archivos que se escribieron en el segmento de la sección Escribir en Cloud Storage.

Siguientes pasos