使用熊猫从Google Cloud Storage读取CSV文件

时间:2019-03-04 17:03:03

标签: pandas google-cloud-storage dask

我正尝试按照Read csv from Google Cloud storage to pandas dataframe

中的说明,从Google云端存储中读取一堆CSV文件到熊猫数据帧中
storage_client = storage.Client()

bucket = storage_client.bucket(bucket_name)
blobs = bucket.list_blobs(prefix=prefix)

list_temp_raw = []
for file in blobs:
    filename = file.name
    temp = pd.read_csv('gs://'+bucket_name+'/'+filename+'.csv', encoding='utf-8')
list_temp_raw.append(temp)

df = pd.concat(list_temp_raw)

在导入gcfs时显示以下错误消息。软件包“ dask”和“ gcsfs”已经安装在我的机器上;但是,无法摆脱以下错误。

File "C:\Program Files\Anaconda3\lib\site-packages\gcsfs\dask_link.py", line 
121, in register
dask.bytes.core._filesystems['gcs'] = DaskGCSFileSystem
AttributeError: module 'dask.bytes.core' has no attribute '_filesystems'

3 个答案:

答案 0 :(得分:1)

已经过测试,可以在其他地方使用-无论是直接从GCS读取还是通过Dask读取。您不妨尝试导入gcsfs和dask,看看是否可以看到_filesystems并查看其内容

In [1]: import dask.bytes.core

In [2]: dask.bytes.core._filesystems
Out[2]: {'file': dask.bytes.local.LocalFileSystem}

In [3]: import gcsfs

In [4]: dask.bytes.core._filesystems
Out[4]:
{'file': dask.bytes.local.LocalFileSystem,
 'gcs': gcsfs.dask_link.DaskGCSFileSystem,
 'gs': gcsfs.dask_link.DaskGCSFileSystem}

https://github.com/dask/gcsfs/pull/129开始,如果gcsfs无法向Dask注册,则其性能会更好,因此更新可能会解决您的问题。

答案 1 :(得分:0)

gcsfsdask软件包之间似乎存在一些错误或冲突。实际上,您的代码不需要dask库。您的代码要运行的最低配置是安装库(我正在发布其最新版本):

google-cloud-storage==1.14.0
gcsfs==0.2.1
pandas==0.24.1

此外,filename已经包含.csv扩展名。因此,将第9行更改为:

temp = pd.read_csv('gs://' + bucket_name + '/' + filename, encoding='utf-8')

通过此更改,我运行了您的代码,它可以正常工作。我建议您create a virtual env and install the libraries and run the code there

答案 2 :(得分:0)

上面的文字中没有什么要指出的: 需要定义bucket_name和前缀。 并且文件名的迭代应该每次都附加每个数据帧。否则,它将是最后一个被连接的

from google.cloud import storage
import pandas as pd

storage_client = storage.Client()

buckets_list = list(storage_client.list_buckets())
bucket_name='my_bucket'
bucket = storage_client.bucket(bucket_name)
blobs = bucket.list_blobs()

list_temp_raw = []
for file in blobs:
    filename = file.name
    temp = pd.read_csv('gs://'+bucket_name+'/'+filename, encoding='utf-8')
    print(filename, temp.head())
    list_temp_raw.append(temp)

df = pd.concat(list_temp_raw)