Ich versuche, eine im Google Cloud Storage-Bucket vorhandene CSV-Datei auf einen Panda-Datenrahmen zu lesen.
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)
Es zeigt diese Fehlermeldung:
FileNotFoundError: File b'gs://createbucket123/my.csv' does not exist
Was mache ich falsch, ich kann keine Lösung finden, die Google Datalab nicht beinhaltet?
Seit Version 0.24 von Pandas unterstützt read_csv
das direkte Lesen aus Google Cloud Storage. Geben Sie einfach den Link zum Bucket wie folgt an:
df = pd.read_csv('gs://bucket/your_path.csv')
Der Vollständigkeit halber lasse ich drei weitere Optionen.
Ich werde sie unten behandeln.
Ich habe einige praktische Funktionen zum Lesen von Google Storage geschrieben. Um es lesbarer zu machen, fügte ich Typanmerkungen hinzu. Wenn Sie sich auf Python 2 befinden, entfernen Sie diese einfach, und der Code funktioniert trotzdem.
Es funktioniert gleichermaßen für öffentliche und private Datensätze, vorausgesetzt, Sie sind autorisiert. Bei diesem Ansatz müssen Sie die Daten nicht zuerst auf Ihr lokales Laufwerk herunterladen.
Wie man es benutzt:
fileobj = get_byte_fileobj('my-project', 'my-bucket', 'my-path')
df = pd.read_csv(fileobj)
Der 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 ist ein "Pythonic-Dateisystem für Google Cloud Storage".
Wie man es benutzt:
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 "bietet erweiterte Parallelität für die Analyse und ermöglicht so eine Skalierbarkeit für die von Ihnen bevorzugten Tools". Es ist großartig, wenn Sie mit großen Datenmengen in Python umgehen müssen. Dask versucht, einen Großteil der pandas
-API nachzuahmen, wodurch es für Neulinge einfach zu verwenden ist.
Hier ist die read_csv
Wie man es benutzt:
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()
Eine andere Option ist die Verwendung von TensorFlow, mit dem Streaming-Lesevorgänge aus Google Cloud Storage durchgeführt werden können:
from tensorflow.python.lib.io import file_io
with file_io.FileIO('gs://bucket/file.csv', 'r') as f:
df = pd.read_csv(f)
Mit Tensorflow können Sie auch Platzhalter im Dateinamen bequem behandeln. Zum Beispiel:
Hier ist ein Code, der alle CSVs, die einem bestimmten Muster entsprechen (z. B. gs: // bucket/some/dir/train- *), in einen Pandas-Datenrahmen liest:
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
unterstützt gs://
nicht
Aus der Dokumentation :
Die Zeichenfolge kann eine URL sein. Gültige URL-Schemas sind http, ftp, s3, und Datei. Für Datei-URLs wird ein Host erwartet. Zum Beispiel eine lokale Datei könnte Datei sein: //localhost/path/to/table.csv
Sie können die Datei herunterladen oder als String abrufen , um sie zu bearbeiten.
Es gibt drei Möglichkeiten, auf Dateien im GCS zuzugreifen:
Verwenden Sie Schritt 1, setup the GSC für Ihre Arbeit. Nach dem müssen Sie:
import cloudstorage as gcs
from google.appengine.api import app_identity
Dann müssen Sie den Cloud Storage-Bucketnamen angeben und Lese-/Schreibfunktionen für den Zugriff auf Ihren Bucket erstellen:
Das restliche Lese-/Schreib-Tutorial hier :
Wenn ich Ihre Frage richtig verstanden habe, hilft Ihnen dieser Link möglicherweise, eine bessere URL für Ihre read_csv () - Funktion zu erhalten:
Ab pandas==0.24.0
wird dies nativ unterstützt, wenn Sie gcsfs
installiert haben: https://github.com/pandas-dev/pandas/pull/22704 .
Bis zur offiziellen Veröffentlichung können Sie es mit pip install pandas==0.24.0rc1
ausprobieren.