我在Google Cloud上设置了一个包含几百个json文件的存储桶,并尝试在运行python 3的datalab实例中使用它们。
因此,我可以使用
轻松地将它们视为对象gcs list --objects gs://<BUCKET_NAME>
此外,我可以使用
读取单个文件/对象 import google.datalab.storage as storage
import pandas as pd
from io import BytesIO
myBucket = storage.Bucket('<BUCKET_NAME')
data_csv = myBucket.object('<FILE_NAME.json')
uri = data_csv.uri
%gcs read --object $uri --variable data
df = pd.read_csv(BytesIO(data))
df.head()
(仅供参考,我知道我的例子是将json作为csv阅读,但让我们忽略这一点 - 我将自己跨越那座桥梁)
我能弄清楚的是如何循环访问存储桶并将所有json文件拉入pandas ......我该怎么做?这是我应该考虑的方式 - 有没有办法直接从pandas中调用存储桶中的文件(因为它们已被视为对象)?
作为额外的一点 - 如果一个文件被保存为json,但实际上该结构是什么呢?我该怎么处理?
基本上,我想,我正在寻找blob软件包的功能,但是使用云桶+ datalab。
非常感谢任何帮助。
答案 0 :(得分:1)
这可以使用Bucket.objects
来完成,它返回一个包含所有匹配文件的迭代器。指定前缀或将其留空以匹配存储桶中的所有文件。我做了两个文件countries1.csv
和countries2.csv
:
$ cat countries1.csv
id,country
1,sweden
2,spain
$ cat countries2.csv
id,country
3,italy
4,france
并使用以下Datalab代码段:
import google.datalab.storage as storage
import pandas as pd
from io import BytesIO
myBucket = storage.Bucket('BUCKET_NAME')
object_list = myBucket.objects(prefix='countries')
df_list = []
for object in object_list:
%gcs read --object $object.uri --variable data
df_list.append(pd.read_csv(BytesIO(data)))
concatenated_df = pd.concat(df_list, ignore_index=True)
concatenated_df.head()
将输出组合的csv:
id country
0 1 sweden
1 2 spain
2 3 italy
3 4 france
考虑到我使用this approach将所有csv文件合并到一个Pandas数据框中,但您可能希望根据用例将它们加载到不同的数据框中。如果要检索存储桶中的所有文件,请改为使用:
object_list = myBucket.objects()