Google Cloud Storage + Python: есть ли способ перечислить obj в определенной папке в GCS?
Я собираюсь написать программу на Python, чтобы проверить, находится ли файл в определенной папке моего Google Cloud Storage, основная идея состоит в том, чтобы получить list
всех объектов в папке, имя файла list
, а затем проверьте, если файл abc.txt
находится в имени файла list
,
Теперь проблема в том, что, похоже, Google предоставляет только один способ получить obj
list
, который 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() возвращает итератор, используемый для поиска больших двоичных объектов в корзине. Теперь вы можете перебирать большие двоичные объекты и получать доступ к каждому объекту в корзине. В этом примере я просто распечатываю название объекта.
Эта документация мне очень помогла:
https://googleapis.github.io/google-cloud-python/latest/storage/blobs.html
https://googleapis.github.io/google-cloud-python/latest/_modules/google/cloud/storage/client.html
Я надеюсь, что смогу помочь!
Вы также можете посмотреть на 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}")