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

Importing multiple files from Google Cloud Bucket to Datalab instance

我在 Google 云上设置了一个包含几百个 json 文件的存储桶,我正在尝试在数据实验室实例中使用它们 运行 python 3 .

因此,我可以使用

轻松地将它们视为对象
gcs list --objects gs://<BUCKET_NAME>

此外,我可以使用

阅读个人file/object
 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 包的功能,但是使用云桶 + 数据实验室。

非常感谢任何帮助。

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