Google Cloud Storage + Python: есть ли способ перечислить obj в определенной папке в GCS?

Я собираюсь написать программу на Python, чтобы проверить, находится ли файл в определенной папке моего облачного хранилища Google, основная идея состоит в том, чтобы получить list всех объектов в папке, имя файла list, а затем проверить, находится ли файл abc.txt находится в имени файла list.

Теперь проблема в том, что Google предоставляет только один способ получить obj list, то есть uri.get_bucket(), см. ниже код, который взят из https://developers.google.com/storage/docs/gspythonlibrary#listing-objects

uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
    print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
    print '  "%s"' % obj.get_contents_as_string()

Дефект uri.get_bucket() заключается в том, что сначала он получает весь объект, это то, чего я не хочу, мне просто нужно получить obj имя list конкретной папки (например, gs//mybucket/abc/myfolder), что должно быть очень быстро.

Может кто поможет ответить? Цените каждый ответ!


person Reed_Xia    schedule 14.03.2014    source источник


Ответы (4)


Обновление: приведенное ниже верно для более старых «Клиентских библиотек API Google» для Python, но если вы не используете этот клиент, отдайте предпочтение более новой «Клиентской библиотеке Google Cloud» для Python ( https://googleapis.dev/python/storage/latest/index.html ). Для более новой библиотеки эквивалент приведенного ниже кода:

from google.cloud import storage

client = storage.Client()
for blob in client.list_blobs('bucketname', prefix='abc/myfolder'):
  print(str(blob))

Ответ для старого клиента следует.

Возможно, вам будет проще работать с JSON API, который имеет полнофункциональный клиент Python. У него есть функция для перечисления объектов, которые принимают префиксный параметр, который вы можете использовать для проверки определенного каталога и его дочерних элементов следующим образом:

from apiclient import discovery

# Auth goes here if necessary. Create authorized http object...
client = discovery.build('storage', 'v1') # add http=whatever param if auth
request = client.objects().list(
    bucket="mybucket",
    prefix="abc/myfolder")
while request is not None:
  response = request.execute()
  print json.dumps(response, indent=2)
  request = request.list_next(request, response)

Более полная документация по вызову списка находится здесь: https://developers.google.com/storage/docs/json_api/v1/objects/list

Клиент Google Python API задокументирован здесь: https://code.google.com/p/google-api-python-client/

person Brandon Yarbrough    schedule 14.03.2014
comment
Не могли бы вы посоветовать, как определить клиента? Я уже импортировал json и apiclient, но он выдает NameError: имя «клиент» не определено, я проверил документ и не нашел эту часть кода, спасибо! - person Reed_Xia; 18.03.2014
comment
Добавлено немного выше с примером синтаксиса. - person Brandon Yarbrough; 18.03.2014
comment
есть ли способ ускорить это? Это медленно для миллионов капель - person CpILL; 24.04.2020

Это сработало для меня:

client = storage.Client()
BUCKET_NAME = 'DEMO_BUCKET'
bucket = client.get_bucket(BUCKET_NAME)

blobs = bucket.list_blobs()

for blob in blobs:
    print(blob.name)

Метод list_blobs() вернет итератор, используемый для поиска больших двоичных объектов в корзине. Теперь вы можете перебирать большие двоичные объекты и получать доступ к каждому объекту в ведре. В этом примере я просто распечатываю имя объекта.

Эта документация мне очень помогла:

Надеюсь, я смог помочь!

person Sharif Elfouly    schedule 05.04.2019
comment
И если вы хотите отфильтровать файлы в определенной папке, используйте bucket.list_blobs(prefix="path") - person John; 10.04.2019

Вы также можете посмотреть на gcloud-python и документация.

from gcloud import storage
connection = storage.get_connection(project_name, email, private_key_path)
bucket = connection.get_bucket('my-bucket')

for key in bucket:
  if key.name == 'abc.txt':
    print 'Found it!'
    break

Однако вам может быть лучше просто проверить, существует ли файл:

if 'abc.txt' in bucket:
  print 'Found it!'
person JJ Geewax    schedule 14.03.2014
comment
Я работаю над Windows 7, мне не удалось установить easy_install gcloud, в конце концов он заканчивался предупреждением: библиотека GMP или MPIR не найдена; Не создавать Crypto.PublicKey._fastmath. ошибка: Сценарий установки завершился с ошибкой: Не удалось найти vcvarsall.bat, не могли бы вы посоветовать? Благодарю вас! - person Reed_Xia; 18.03.2014
comment
У вас установлен PyCrypto и все остальные? Я полагаю, что установщики Windows для них доступны в Интернете. - person JJ Geewax; 18.03.2014

Установите пакет python google-cloud-storage с помощью pip или pycharm и используйте приведенный ниже код.

from google.cloud import storage
client = storage.Client()
for blob in client.list_blobs(BUCKET_NAME, prefix=FOLDER_NAME):
  print(str(blob))
person Abhijit    schedule 30.12.2020