Regex с параметром префикса для list_blobs_with_prefix () - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь получить объекты из хранилища gcp с префиксом, используя клиент Python API, но получаю проблему с параметром префикса.Я могу сделать это в gsutil с

gsutil ls -h gs://{{bucket-name}}/*/latest/

Но не с Python API

Я использую функцию из документации.Попытался передать префиксный параметр как

*/latest/ /*/latest *

и оставить разделитель равным none. До сих пор не получил никакого результата.

    storage_client = storage.Client()

    # Note: Client.list_blobs requires at least package version 1.17.0.
    blobs = storage_client.list_blobs(bucket_name, prefix=prefix,
                                      delimiter=delimiter)

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

    if delimiter:
        print('Prefixes:')
        for prefix in blobs.prefixes:
            print(prefix)

Ожидаемый результат -

gs://{{bucket-name}}/product/latest/:
gs://{{bucket-name}}/product/latest/health
gs://{{bucket-name}}/product/latest/index.html

1 Ответ

0 голосов
/ 27 сентября 2019

gsutil знает о регулярных выражениях, а сами GCS API - нет.API поддерживают только буквенные префиксы.

Вместо этого вам нужно будет извлекать все и фильтровать с помощью регулярных выражений, что и делает gsutil в вашем примере.

all_blobs = storage_client.list_blobs(bucket_name)
regex = re.compile(r'.*/latest/.*')
blobs = filter(regex.match, all_blobs)

Если выу вас будет слишком много объектов, чтобы это стоило того, я рекомендую реорганизовать ваши данные таким образом, чтобы вы могли поместить сопоставление без подстановочных знаков в начале пути, чтобы можно было фильтровать на стороне сервера.

...