Google Cloud Storageバケットにあるcsvファイルをパンダデータフレームに読み取ろうとしています。
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)
次のエラーメッセージが表示されます。
FileNotFoundError: File b'gs://createbucket123/my.csv' does not exist
私は何を間違えていますか、グーグルデータラボを含まないソリューションを見つけることができませんか?
パンダのバージョン0.24では、read_csv
はGoogle Cloud Storageからの直接読み取りをサポートしています。次のようにバケットへのリンクを提供するだけです:
df = pd.read_csv('gs://bucket/your_path.csv')
完全を期すために、他の3つのオプションを残します。
それらを以下で説明します。
Google Storageから読み込む便利な関数をいくつか作成しました。より読みやすくするために、型注釈を追加しました。 Python 2を使用している場合は、これらを削除するだけで、コードはすべて同じように機能します。
許可されていることを前提として、パブリックデータセットとプライベートデータセットで等しく機能します。このアプローチでは、最初にデータをローカルドライブにダウンロードする必要はありません。
それを使用する方法:
fileobj = get_byte_fileobj('my-project', 'my-bucket', 'my-path')
df = pd.read_csv(fileobj)
コード:
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 は「Google Cloud StorageのPythonファイルシステム」です。
それを使用する方法:
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 「分析に高度な並列処理を提供し、お気に入りのツールに大規模なパフォーマンスを実現します」。 Pythonで大量のデータを処理する必要がある場合に最適です。 Daskはpandas
APIの多くを模倣しようとしているため、初心者でも簡単に使用できます。
これが read_csv です
それを使用する方法:
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()
もう1つのオプションは、Google Cloud Storageからストリーミング読み取りを行う機能を備えたTensorFlowを使用することです。
from tensorflow.python.lib.io import file_io
with file_io.FileIO('gs://bucket/file.csv', 'r') as f:
df = pd.read_csv(f)
Tensorflowを使用すると、ファイル名のワイルドカードを処理する便利な方法も提供されます。例えば:
特定のパターン(例:gs:// bucket/some/dir/train- *)に一致するすべてのCSVを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
はgs://
をサポートしていません
ドキュメント から:
文字列はURLである可能性があります。有効なURLスキームには、http、ftp、s3、およびfileが含まれます。ファイルURLの場合、ホストが必要です。たとえば、ローカルファイルはファイル://localhost/path/to/table.csvになります。
ファイルをダウンロード または 文字列として取得 を操作することができます。
pandas==0.24.0
現在、gcsfs
がインストールされている場合、これはネイティブにサポートされます: https://github.com/pandas-dev/pandas/pull/22704 。
公式リリースまでは、pip install pandas==0.24.0rc1
で試してみることができます。
GCSのファイルにアクセスするには、3つの方法があります。
ステップ1を使用して、 setup 作業用のGSC。その後、以下を行う必要があります。
import cloudstorage as gcs
from google.appengine.api import app_identity
次に、Cloud Storageバケット名を指定し、バケットにアクセスするための読み取り/書き込み関数を作成する必要があります。
残りの読み取り/書き込みチュートリアルを見つけることができます here :
あなたの質問を正しく理解したら、このリンクはあなたのread_csv()関数のより良いURLを得るのに役立つかもしれません: