Google Cloud Storage: как удалить папку (рекурсивно) в Python

Я пытаюсь удалить папку в GCS и все ее содержимое (включая подкаталоги) с помощью библиотеки Python. Также я понимаю, что в GCS на самом деле нет папок (но префикс?), но мне интересно, как я могу это сделать?

Я тестировал этот код:

from google.cloud import storage

def delete_blob(bucket_name, blob_name):
    """Deletes a blob from the bucket."""
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(blob_name)

    blob.delete()

delete_blob('mybucket', 'top_folder/sub_folder/test.txt')
delete_blob('mybucket', 'top_folder/sub_folder/')

Первый вызов delete_blob сработал, но не второй. Что я могу удалить папку рекурсивно?


person kee    schedule 13.10.2018    source источник


Ответы (1)


Чтобы удалить все, что начинается с определенного префикса (например, имя каталога), вы можете перебрать список:

storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blobs = bucket.list_blobs(prefix='some/directory')
for blob in blobs:
  blob.delete()

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

person Brandon Yarbrough    schedule 13.10.2018
comment
Моя первоначальная догадка заключалась в том, чтобы перечислить все, а затем перебрать и удалить те, которые соответствуют заданному пути ... но рад узнать, что эти параметры существуют в API (в моем случае API java-хранилища). Спасибо :) - person Sudip Bhandari; 08.04.2020
comment
Вы также можете использовать метод bucket.delete_blobs для удаления всех файлов списка с одним сетевым обходом O (1) вместо O (n) отдельных вызовов delete. - person user482594; 24.06.2021