Как получить доступ к файлам в подпапках ведра GCS, используя Python? - PullRequest
0 голосов
/ 18 февраля 2019
from google.cloud import storage
import os
bucket = client.get_bucket('path to bucket')

Приведенный выше код соединяет меня с моей корзиной, но я изо всех сил пытаюсь соединиться с определенной папкой внутри корзины.

Я пробую варианты этого кода, но не повезло:

blob = bucket.get_blob("training/bad")
blob = bucket.get_blob("/training/bad")
blob = bucket.get_blob("path to bucket/training/bad")

Я надеюсь получить доступ к списку изображений в плохой подпапке, но я не могу этого сделать.Я даже не до конца понимаю, что такое блоб, несмотря на то, что он читает документы и что-то вроде этого, основываясь на уроках.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Если вы хотите найти blob (файлы), которые существуют под конкретным префиксом (подкаталог), вы можете указать prefix и delimiter аргументы для list_blobs() function

См. Следующий пример, взятый из примера Google Listing Objects (также Фрагмент GitHub )

def list_blobs_with_prefix(bucket_name, prefix, delimiter=None):
    """Lists all the blobs in the bucket that begin with the prefix.

    This can be used to list all blobs in a "folder", e.g. "public/".

    The delimiter argument can be used to restrict the results to only the
    "files" in the given "folder". Without the delimiter, the entire tree under
    the prefix is returned. For example, given these blobs:

        /a/1.txt
        /a/b/2.txt

    If you just specify prefix = '/a', you'll get back:

        /a/1.txt
        /a/b/2.txt

    However, if you specify prefix='/a' and delimiter='/', you'll get back:

        /a/1.txt

    """
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)

    blobs = bucket.list_blobs(prefix=prefix, delimiter=delimiter)

    print('Blobs:')
    for blob in blobs:
        print(blob.name)

    if delimiter:
        print('Prefixes:')
        for prefix in blobs.prefixes:
            print(prefix)
0 голосов
/ 18 февраля 2019

Что вы упустили, так это тот факт, что в GCS объекты в корзине организованы не в структуре / иерархии каталогов, подобной файловой системе, а в плоской структуре.

Более подробное объяснение можно найтив Как работают подкаталоги (в контексте gsutil, правда, но фундаментальная причина та же - плоское пространство имен GCS):

gsutil создает иллюзию иерархической иерархииДерево файлов поверх «плоского» пространства имен, поддерживаемого сервисом Google Cloud Storage.Для сервиса объект gs: //your-bucket/abc/def.txt - это просто объект, в имени которого есть символы "/".Нет каталога "abc";только один объект с заданным именем.

Поскольку в GCS нет (под) каталогов, то /training/bad на самом деле не существует, поэтому вы не можете перечислить его содержимое.Все, что вы можете сделать, это перечислить все объекты в корзине и выбрать объекты с именами / путями, которые начинаются с /training/bad.

...