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?
À 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.
Je vais les couvrir ci-dessous.
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 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 "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()
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:
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)
DATADIR='gs://my-bucket/some/dir'
traindf = read_csv_files(os.path.join(DATADIR, 'train-*'))
evaldf = read_csv_files(os.path.join(DATADIR, 'eval-*'))
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.
Il y a trois manières d'accéder aux fichiers dans le SCG:
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 :
Si j'ai bien compris votre question, alors ce lien peut vous aider à obtenir un meilleur URL pour votre fonction read_csv ():
À 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
.