Como ler e gravar no Google Cloud Storage

Neste documento, você verá a descrição de como armazenar e recuperar dados usando a biblioteca de cliente do App Engine para 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 intervalo do Cloud Storage e fazer o download das bibliotecas de cliente. Também é necessário que você saiba criar um aplicativo do App Engine, conforme descrito em Guia de início rápido do ambiente padrão do App Engine para Python 2.

Importações obrigatórias

O arquivo main.py contém as importações típicas usadas para acessar o Cloud Storage por meio da biblioteca de cliente:

import logging
import os
import cloudstorage as gcs
import webapp2

from google.appengine.api import app_identity

É necessário ter o módulo os e a API app_identity para receber o nome do intervalo padrão no ambiente de execução. Observe que será preciso encontrar outra maneira de fornecer o nome do intervalo caso o intervalo padrão não seja usado.

Como especificar o intervalo do Cloud Storage

Antes de realizar qualquer operação no Cloud Storage, é necessário fornecer o nome do intervalo. A maneira mais fácil de fazer isso é usando o intervalo padrão do projeto, que pode ser recebido da seguinte maneira:

def get(self):
  bucket_name = os.environ.get('BUCKET_NAME',
                               app_identity.get_default_gcs_bucket_name())

  self.response.headers['Content-Type'] = 'text/plain'
  self.response.write('Demo GCS Application running from Version: '
                      + os.environ['CURRENT_VERSION_ID'] + '\n')
  self.response.write('Using bucket name: ' + bucket_name + '\n\n')

A chamada para get_default_gcs_bucket_name só será bem-sucedida se o intervalo padrão tiver sido criado para o projeto.

Como gravar no Cloud Storage

O exemplo a seguir mostra como gravar no intervalo:

def create_file(self, filename):
  """Create a file.

  The retry_params specified in the open call will override the default
  retry params for this particular file handle.

  Args:
    filename: filename.
  """
  self.response.write('Creating file %s\n' % filename)

  write_retry_params = gcs.RetryParams(backoff_factor=1.1)
  gcs_file = gcs.open(filename,
                      'w',
                      content_type='text/plain',
                      options={'x-goog-meta-foo': 'foo',
                               'x-goog-meta-bar': 'bar'},
                      retry_params=write_retry_params)
  gcs_file.write('abcde\n')
  gcs_file.write('f'*1024*4 + '\n')
  gcs_file.close()
  self.tmp_filenames_to_clean_up.append(filename)

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

Observe também que o cabeçalho x-goog-acl não está definido. Isso significa que a ACL padrão do Cloud Storage de leitura pública será aplicada ao objeto quando ele for gravado no intervalo.

Por último, observe a chamada para fechar (close) o arquivo depois de terminar a gravação. Se não fizer isso, o arquivo não será gravado no Cloud Storage. Esteja ciente de que, depois de chamar close, você não poderá anexar ao arquivo. Se for necessário modificar um arquivo, você terá que abri-lo novamente no modo de gravação, o que gera uma substituição, não um anexo.

Como fazer a leitura do Cloud Storage

O exemplo a seguir mostra como ler um arquivo a partir do intervalo.

def read_file(self, filename):
  self.response.write('Reading the full file contents:\n')

  gcs_file = gcs.open(filename)
  contents = gcs_file.read()
  gcs_file.close()
  self.response.write(contents)

O argumento filename é especificado no formato YOUR_BUCKET_NAME/PATH_IN_GCS. A amostra exemplifica a exibição das linhas selecionadas do arquivo que está sendo lido, neste caso, a linha de abertura e as últimas mil linhas, usando seek.

Observe que nenhum modo é especificado no código acima quando o arquivo é aberto para leitura. O padrão para open é o modo somente leitura.

Como listar conteúdo do intervalo

O código de amostra demonstra como percorrer um intervalo com um grande número de arquivos usando os parâmetros marker e max_keys por uma lista do conteúdo do intervalo:

def list_bucket(self, bucket):
  """Create several files and paginate through them.

  Production apps should set page_size to a practical value.

  Args:
    bucket: bucket.
  """
  self.response.write('Listbucket result:\n')

  page_size = 1
  stats = gcs.listbucket(bucket + '/foo', max_keys=page_size)
  while True:
    count = 0
    for stat in stats:
      count += 1
      self.response.write(repr(stat))
      self.response.write('\n')

    if count != page_size or count == 0:
      break
    stats = gcs.listbucket(bucket + '/foo', max_keys=page_size,
                           marker=stat.filename)

Observe que o nome completo do arquivo é exibido como uma string sem delimitadores de diretório. Para exibir o arquivo com sua hierarquia de diretório 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.

def delete_files(self):
  self.response.write('Deleting files...\n')
  for filename in self.tmp_filenames_to_clean_up:
    self.response.write('Deleting file %s\n' % filename)
    try:
      gcs.delete(filename)
    except gcs.NotFoundError:
      pass

Este exemplo limpa os arquivos que foram gravados no intervalo na seção Como gravar no Cloud Storage.

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2