我正尝试按照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'
答案 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)
gcsfs
和dask
软件包之间似乎存在一些错误或冲突。实际上,您的代码不需要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)