web-dev-qa-db-fra.com

Lisez les fichiers csv du stockage Google Cloud vers le fichier de données pandas

J'essaie de lire un fichier csv présent sur le compartiment de Google Cloud Storage sur un fichier de données panda. 

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from io import BytesIO

from google.cloud import storage

storage_client = storage.Client()
bucket = storage_client.get_bucket('createbucket123')
blob = bucket.blob('my.csv')
path = "gs://createbucket123/my.csv"
df = pd.read_csv(path)

Il affiche ce message d'erreur:

FileNotFoundError: File b'gs://createbucket123/my.csv' does not exist

Qu'est-ce que je fais mal, je ne parviens pas à trouver une solution n'impliquant pas Google Datalab?

8
user1838940

METTRE À JOUR

À partir de la version 0.24 de pandas, read_csv prend en charge la lecture directement à partir de Google Cloud Storage. Fournissez simplement un lien vers le seau comme ceci:

df = pd.read_csv('gs://bucket/your_path.csv')

Je laisse trois autres options dans un souci de complétude.

  • Code fait maison
  • gcsfs
  • dask

Je vais les couvrir ci-dessous.

La dure: code de bricolage

J'ai écrit quelques fonctions pratiques à lire sur Google Storage. Pour le rendre plus lisible, j'ai ajouté des annotations de type. Si vous êtes sur Python 2, supprimez-les simplement et le code fonctionnera de la même manière. 

Cela fonctionne également sur les ensembles de données publics et privés, à condition que vous soyez autorisé. Dans cette approche, vous n'avez pas besoin de télécharger d'abord les données sur votre disque local.

Comment l'utiliser:

fileobj = get_byte_fileobj('my-project', 'my-bucket', 'my-path')
df = pd.read_csv(fileobj)

Le code:

from io import BytesIO, StringIO
from google.cloud import storage
from google.oauth2 import service_account

def get_byte_fileobj(project: str,
                     bucket: str,
                     path: str,
                     service_account_credentials_path: str = None) -> BytesIO:
    """
    Retrieve data from a given blob on Google Storage and pass it as a file object.
    :param path: path within the bucket
    :param project: name of the project
    :param bucket_name: name of the bucket
    :param service_account_credentials_path: path to credentials.
           TIP: can be stored as env variable, e.g. os.getenv('GOOGLE_APPLICATION_CREDENTIALS_DSPLATFORM')
    :return: file object (BytesIO)
    """
    blob = _get_blob(bucket, path, project, service_account_credentials_path)
    byte_stream = BytesIO()
    blob.download_to_file(byte_stream)
    byte_stream.seek(0)
    return byte_stream

def get_bytestring(project: str,
                   bucket: str,
                   path: str,
                   service_account_credentials_path: str = None) -> bytes:
    """
    Retrieve data from a given blob on Google Storage and pass it as a byte-string.
    :param path: path within the bucket
    :param project: name of the project
    :param bucket_name: name of the bucket
    :param service_account_credentials_path: path to credentials.
           TIP: can be stored as env variable, e.g. os.getenv('GOOGLE_APPLICATION_CREDENTIALS_DSPLATFORM')
    :return: byte-string (needs to be decoded)
    """
    blob = _get_blob(bucket, path, project, service_account_credentials_path)
    s = blob.download_as_string()
    return s


def _get_blob(bucket_name, path, project, service_account_credentials_path):
    credentials = service_account.Credentials.from_service_account_file(
        service_account_credentials_path) if service_account_credentials_path else None
    storage_client = storage.Client(project=project, credentials=credentials)
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(path)
    return blob

gcsfs

gcsfs est un "système de fichiers Pythonic pour Google Cloud Storage". 

Comment l'utiliser:

import pandas as pd
import gcsfs

fs = gcsfs.GCSFileSystem(project='my-project')
with fs.open('bucket/path.csv') as f:
    df = pd.read_csv(f)

dask

Dask "fournit un parallélisme avancé pour l’analyse, permettant des performances à grande échelle pour les outils que vous aimez". C'est formidable lorsque vous devez traiter de gros volumes de données en Python. Dask tente d'imiter une grande partie de l'API pandas, facilitant ainsi son utilisation par les nouveaux arrivants. 

Voici le read_csv

Comment l'utiliser:

import dask.dataframe as dd

df = dd.read_csv('gs://bucket/data.csv')
df2 = dd.read_csv('gs://bucket/path/*.csv') # Nice!

# df is now Dask dataframe, ready for distributed processing
# If you want to have the pandas version, simply:
df_pd = df.compute()
18

Une autre option consiste à utiliser TensorFlow, qui permet d'effectuer une lecture en flux continu à partir de Google Cloud Storage:

from tensorflow.python.lib.io import file_io
with file_io.FileIO('gs://bucket/file.csv', 'r') as f:
  df = pd.read_csv(f)

L'utilisation de tensorflow vous offre également un moyen pratique de gérer les caractères génériques dans le nom de fichier. Par exemple:

Lecture de CSV générique dans des pandas

Voici un code qui lira tous les CSV correspondant à un modèle spécifique (par exemple: gs: // bucket/some/dir/train- *) dans un cadre de données Pandas:

import tensorflow as tf
from tensorflow.python.lib.io import file_io
import pandas as pd

def read_csv_file(filename):
  with file_io.FileIO(filename, 'r') as f:
    df = pd.read_csv(f, header=None, names=['col1', 'col2'])
    return df

def read_csv_files(filename_pattern):
  filenames = tf.gfile.Glob(filename_pattern)
  dataframes = [read_csv_file(filename) for filename in filenames]
  return pd.concat(dataframes)

usage

DATADIR='gs://my-bucket/some/dir'
traindf = read_csv_files(os.path.join(DATADIR, 'train-*'))
evaldf = read_csv_files(os.path.join(DATADIR, 'eval-*'))
7
Lak

read_csv ne supporte pas gs://

De la documentation :

La chaîne pourrait être une URL. Les schémas d'URL valides incluent http, ftp, s3, et fichier. Pour les URL de fichier, un hôte est attendu. Par exemple, un local fichier peut être fichier: //localhost/path/to/table.csv

Vous pouvez télécharger le fichier ou le récupérer sous forme de chaîne afin de le manipuler.

2
Burhan Khalid

Il y a trois manières d'accéder aux fichiers dans le SCG: 

  1. Téléchargement de la bibliothèque client (celle-ci pour vous)
  2. Utilisation du navigateur Cloud Storage dans la console Google Cloud Platform
  3. Utilisation de gsutil, un outil de ligne de commande permettant d’utiliser des fichiers dans Cloud Storage.

Utilisez l'étape 1, setup the GSC pour votre travail. Après quoi vous devez:

import cloudstorage as gcs
from google.appengine.api import app_identity

Ensuite, vous devez spécifier le nom du compartiment Cloud Storage et créer des fonctions de lecture/écriture pour accéder à votre compartiment:

Vous pouvez trouver le reste du didacticiel de lecture/écriture ici :

1
Ahmad M.

Si j'ai bien compris votre question, alors ce lien peut vous aider à obtenir un meilleur URL pour votre fonction read_csv ():

https://cloud.google.com/storage/docs/access-public-data

1
shubham

À partir de pandas==0.24.0, ceci est supporté de manière native si vous avez installé gcsfs: https://github.com/pandas-dev/pandas/pull/22704 .

Jusqu'à la sortie officielle, vous pouvez l'essayer avec pip install pandas==0.24.0rc1.

1
bnaul