Como ler e gravar no Cloud Storage

Neste documento, descrevemos como armazenar e recuperar dados usando a biblioteca de cliente do Cloud Storage. O ideal é que você já tenha concluído as tarefas descritas na seção Como configurar o Google Cloud Storage para ativar um bucket do Cloud Storage e fazer o download das bibliotecas de cliente. Também é necessário que você saiba criar um aplicativo do App Engine.

Para ver outras amostras de código, consulte Bibliotecas de cliente do Cloud Storage

Importações obrigatórias

Use o snippet de código abaixo para acessar o Cloud Storage usando a 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.")

Como especificar o bucket do Cloud Storage

Antes de realizar qualquer operação no Cloud Storage, é necessário fornecer o nome do 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.")

A maneira mais fácil de especificar um nome de bucket é usar o bucket padrão do projeto. A chamada para get_default_gcs_bucket_name terá êxito se você tiver criado o bucket padrão para seu projeto.

Como gravar no Cloud Storage

No exemplo a seguir, mostramos como gravar no 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())

Observações:

  • Observe que, na chamada para abrir o arquivo para gravação, a amostra especifica determinados cabeçalhos do Cloud Storage que gravam metadados personalizados para o arquivo. Esses metadados podem ser recuperados usando cloudstorage.stat(). Encontre a lista de cabeçalhos compatíveis na referência cloudstorage.open().

  • O cabeçalho x-goog-acl não foi definido. Isso significa que a ACL padrão do Cloud Storage de leitura pública será aplicada ao objeto quando ele for gravado no bucket.

  • Invoque a função para fechar o arquivo após concluir a gravação. Se não a usar, o arquivo não será gravado no Cloud Storage. Depois de chamar a função do arquivo em Python close(), não será possível anexar ao arquivo. Se você precisar modificar um arquivo, precisará chamar a função do arquivo em Python open() para abrir o arquivo novamente no modo de gravação, o que gera uma substituição, não um anexo.

Como fazer a leitura do Cloud Storage

No exemplo a seguir, mostramos como ler um arquivo pelo 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())

Em ambos os exemplos, o argumento blob_name que você transmite para cloudstorage.open() é o caminho para seu arquivo no formato YOUR_BUCKET_NAME/PATH_IN_GCS. O padrão para cloudstorage.open() é o modo somente leitura. Não é preciso especificar um modo ao abrir um arquivo para lê-lo.

Como listar conteúdo do bucket

O exemplo de código mostra como percorrer um bucket com conteúdo do 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)

Observe que o nome completo do arquivo é exibido como uma string sem delimitadores de diretório. Se você quiser exibir o arquivo com a hierarquia de diretórios mais reconhecível, defina o parâmetro delimiter como o delimitador de diretório que quer usar.

Como excluir arquivos no Cloud Storage

O código abaixo demonstra como excluir um arquivo do Cloud Storage usando o 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 exemplo limpa os arquivos que foram gravados no bucket na seção Como gravar no Cloud Storage.

A seguir