Импорт нескольких файлов из Google Cloud Bucket в экземпляр Datalab - PullRequest
0 голосов
/ 06 мая 2018

У меня настроено ведро в Google Cloud, содержащее несколько сотен файлов json, и я пытаюсь работать с ними в экземпляре datalab, работающем под python 3.

Итак, я легко могу видеть их как объекты, используя

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 в панды ... как мне это сделать? Это то, как я должен думать об этом - есть ли способ вызывать файлы в корзине напрямую из панд (так как они уже рассматриваются как объекты)?

В качестве дополнительного бита - что, если файл сохраняется как json, но на самом деле это не та структура? Как я могу справиться с этим?

По сути, я думаю, я ищу функциональность пакета blob, но использую облачные контейнеры + datalab.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 06 мая 2018

Это можно сделать, используя 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

Примите во внимание, что я объединил все CSV-файлы в один фрейм данных Pandas, используя этот подход , но вы можете загрузить их в разные в зависимости от варианта использования. Если вы хотите получить все файлы из корзины, просто используйте это вместо:

object_list = myBucket.objects()
...