Lire et écrire dans Google Cloud Storage

Ce document explique comment stocker et récupérer des données à l'aide de Cloud Storage dans une application App Engine à l'aide de la bibliothèque cliente App Engine pour Cloud Storage. Nous supposons ici que vous avez réalisé les tâches décrites dans la documentation Configuration de Google Cloud Storage pour activer un bucket Cloud Storage et télécharger les bibliothèques clientes. Nous supposons également que vous savez comment créer une application App Engine, comme décrit dans le Guide de démarrage rapide de l'environnement standard App Engine pour Python 2.

Importations obligatoires

Le fichier main.py contient les importations types utilisées pour accéder à Cloud Storage via la bibliothèque cliente :

import logging
import os
import cloudstorage as gcs
import webapp2

from google.appengine.api import app_identity

Vous avez besoin du module os et de l'API app_identity pour obtenir le nom du bucket par défaut au moment de l'exécution. Notez que si vous n'utilisez pas le bucket par défaut, vous avez besoin d'un autre moyen pour fournir le nom du bucket.

Spécifier le bucket Cloud Storage

Avant toute opération dans Cloud Storage, vous devez fournir le nom du bucket. Pour ce faire, le plus simple consiste à utiliser le bucket par défaut de votre projet, qui peut être obtenu comme suit :

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

L'appel de get_default_gcs_bucket_name ne réussit que si vous avez créé le bucket par défaut pour votre projet.

Écrire des données dans Cloud Storage

L'exemple suivant montre comment écrire dans le bucket :

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)

Notez que lors de l'appel de open pour l'ouverture du fichier en écriture, l'exemple spécifie certains en-têtes Cloud Storage qui écrivent des métadonnées personnalisées pour le fichier. Ces métadonnées peuvent être récupérées à l'aide de cloudstorage.stat. Vous trouverez la liste des en-têtes compatibles dans la documentation de référence sur cloudstorage.open.

Notez également que l'en-tête x-goog-acl n'est pas défini. Cela signifie que la liste de contrôle d'accès Cloud Storage par défaut pour la lecture publique va être appliquée à l'objet lorsqu'il est écrit dans le bucket.

Enfin, vous pouvez constater que l'appel close ferme le fichier une fois l'écriture terminée. Si cet appel n'est pas émis, le fichier n'est pas écrit dans Cloud Storage. Sachez qu'après avoir appelé close, vous ne pouvez plus rien ajouter au fichier. Si vous devez modifier un fichier, vous devrez le rouvrir en mode écriture. Les données sont alors écrasées et non ajoutées.

Lire des données à partir de Cloud Storage

L'exemple suivant montre comment lire un fichier à partir du bucket :

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)

L'argument filename est spécifié au format YOUR_BUCKET_NAME/PATH_IN_GCS. L'exemple montre comment afficher les lignes sélectionnées du fichier en cours de lecture (dans le cas présent, la ligne d'ouverture et les mille dernières lignes) à l'aide de seek.

Notez qu'aucun mode n'est spécifié dans le code ci-dessus lorsque le fichier est ouvert en lecture. La valeur par défaut pour open est le mode de lecture seule.

Répertorier le contenu du bucket

L'exemple de code montre comment parcourir un bucket contenant un grand nombre de fichiers, à l'aide du marker et des paramètres max_keys, afin de parcourir la liste du contenu du compartiment :

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)

Notez que le nom de fichier complet est affiché comme une chaîne sans délimiteurs de répertoire. Si vous souhaitez afficher le fichier avec sa hiérarchie de répertoires plus reconnaissable, définissez le paramètre delimiter sur le délimiteur de répertoires que vous souhaitez utiliser.

Supprimer des fichiers de Cloud Storage

Le code ci-dessous montre comment supprimer un fichier de Cloud Storage à l'aide de la méthode cloudstorage.delete() (importée en tant que 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

Cet exemple nettoie les fichiers qui ont été écrits dans le bucket, tel que décrit dans la section Écrire des données dans Cloud Storage.

Étapes suivantes

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement standard App Engine pour Python 2