Lire et écrire sur Cloud Storage

Ce document explique comment stocker et récupérer des données à l'aide de la bibliothèque cliente 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.

Pour obtenir d'autres exemples de code, consultez la page Bibliothèques clientes Cloud Storage.

Importations requises

L'extrait de code ci-dessous permet d'accéder à Cloud Storage à l'aide de la bibliothèque 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.")

Spécifier le bucket Cloud Storage

Avant toute opération dans Cloud Storage, vous devez fournir le nom du 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.")

Le moyen le plus simple de spécifier un nom de bucket consiste à utiliser le bucket par défaut de votre projet. L'appel get_default_gcs_bucket_name ne réussit que si vous avez créé le bucket par défaut pour votre projet.

Écrire dans Cloud Storage

L'exemple suivant montre comment écrire dans le 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())

Veuillez noter les points suivants :

  • Lors de l'appel 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 de cloudstorage.open().

  • 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 lors de son écriture dans le bucket.

  • Vérifiez que vous appelez la fonction pour fermer 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é la fonction du fichier Python close(), vous ne pouvez plus rien ajouter au fichier. Si vous devez modifier un fichier, vous devez appeler la fonction du fichier Python open() pour le rouvrir en mode écriture. Les données sont alors écrasées et non ajoutées.

Lire à partir de Cloud Storage

L'exemple suivant montre comment lire un fichier complet à partir du 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())

Dans les deux exemples, l'argument blob_name que vous transmettez à cloudstorage.open() correspond au chemin d'accès du fichier au format YOUR_BUCKET_NAME/PATH_IN_GCS. Notez que la valeur par défaut pour cloudstorage.open() est le mode lecture seule. Il n'est pas nécessaire de spécifier un mode lorsque vous ouvrez un fichier pour le lire.

Répertorier le contenu du bucket

L'exemple de code montre comment parcourir un bucket avec du contenu de type 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)

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

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

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