Leer y escribir en Cloud Storage

En este documento, se describe cómo almacenar y recuperar datos mediante la biblioteca cliente de Cloud Storage. Se supone que realizaste las tareas descritas en Configura Cloud Storage para activar un bucket de Cloud Storage y descargar las bibliotecas cliente. También se supone que sabes cómo compilar una aplicación de App Engine.

Para obtener muestras de código adicionales, consulta Bibliotecas cliente de Cloud Storage

Importaciones requeridas

Usa el siguiente fragmento de código para acceder a Cloud Storage con la biblioteca 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.")

Especifica el bucket de Cloud Storage

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

# 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 fácil de especificar un nombre de bucket es usar el bucket predeterminado para tu proyecto. La llamada a get_default_gcs_bucket_name se realiza de forma correcta solo si creaste el bucket predeterminado para tu proyecto.

Escribe en Cloud Storage

En el siguiente ejemplo, se muestra como escribir en el bucket:

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 en el que deseas escribir, el ejemplo especifica determinados encabezados de Cloud Storage que escriben metadatos personalizados del archivo. Estos metadatos se pueden recuperar mediante cloudstorage.stat(). Puedes encontrar la lista de encabezados compatibles en la referencia de cloudstorage.open().

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

  • 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 close() del archivo de Python, no puedes adjuntar el archivo. Si necesitas modificar un archivo, tienes que llamar a la función open() del archivo de Python para volver a abrirlo en el modo de escritura, lo cual reemplazará el archivo, no lo adjunta.

Lee en Cloud Storage

En el siguiente ejemplo, se muestra cómo leer un archivo del bucket:

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 pasas a cloudstorage.open() es la ruta de acceso al archivo en formato YOUR_BUCKET_NAME/PATH_IN_GCS. Ten en cuenta que la configuración predeterminada para cloudstorage.open() es el modo de solo lectura. No es necesario especificar un modo cuando se abre un archivo para leerlo.

Enumera el contenido del bucket

En el código de muestra, se indica cómo desplazarse por un bucket 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 completo del archivo se muestra como una string sin delimitadores de directorio. Si deseas mostrar el archivo con su jerarquía de directorios más reconocible, establece el parámetro delimiter en el delimitador del directorio que deseas usar.

Borra archivos en Cloud Storage

En el siguiente código, se muestra cómo borrar 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.")

Este ejemplo limpia los archivos que se escribieron en el depósito en la sección Cómo escribir en Cloud Storage.

¿Qué sigue?