将多个文件从Google Cloud Bucket导入Datalab实例

时间:2018-05-06 01:40:48

标签: python-3.x pandas google-cloud-platform google-cloud-storage google-cloud-datalab

我在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。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这可以使用Bucket.objects来完成,它返回一个包含所有匹配文件的迭代器。指定前缀或将其留空以匹配存储桶中的所有文件。我做了两个文件countries1.csvcountries2.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()