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

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

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

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), что должно быть намного быстрее.

Может ли кто-нибудь помочь ответить? Цени каждый ответ!

5 ответов

Решение

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

from apiclient import discovery

# Auth goes here if necessary. Create authorized http object...
client = discovery.build('storage', 'v1beta2') # 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/

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

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

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

Я надеюсь, что смогу помочь!

Вы также можете посмотреть на 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!'

Установите пакет 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))

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

Когда вы запускаете это:

      from google.cloud import storage
storage_client = storage.Client()
blobs = list(storage_client.list_blobs(bucket_name, prefix=PREFIX, fields="items(name)"))

Вы получите объекты Blob только с полем имени всех файлов в данном сегменте, например:

      [<Blob: BUCKET_NAME, PREFIX, None>, 
 <Blob: xml-BUCKET_NAME, [PREFIX]claim_757325.json, None>, 
 <Blob: xml-BUCKET_NAME, [PREFIX]claim_757390.json, None>,
 ...]

Если вы похожи на меня и хотите 1) отфильтровать первый элемент в списке, потому что он НЕ представляет файл - это просто префикс, 2) просто получить значение строки имени и 3) удалить ПРЕФИКС из файла имя, вы можете сделать что-то вроде этого:

      blob_names = [blob_name.name[len(PREFIX):] for blob_name in blobs if blob_name.name != folder_name]

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

      from google.cloud import storage
storage_client = storage.Client()
blobs = list(storage_client.list_blobs(bucket_name, prefix=PREFIX, fields="items(name)"))
blob_names = [blob_name.name[len(PREFIX):] for blob_name in blobs if blob_name.name != folder_name]
print(f"blob_names = {blob_names}")
Другие вопросы по тегам