25

我将编写一个 Python 程序来检查文件是否在我的 Google Cloud Storage 的某个文件夹中,基本思想是获取list文件夹中所有对象的文件名list,然后检查文件abc.txt是否在文件名list

现在的问题是,看起来谷歌只提供了一种获取方式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),这应该很快。

有人可以帮忙回答吗?欣赏每一个答案!

4

5 回答 5

33

更新:以下适用于 Python 的较旧的“Google API 客户端库”,但如果您不使用该客户端,请更喜欢 Python 的较新的“Google 云客户端库”(https://googleapis.dev/python/存储/最新/index.html)。对于较新的库,等效于以下代码:

from google.cloud import storage

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

老客户的回答如下。

您可能会发现使用具有全功能 Python 客户端的 JSON API 更容易。它有一个用于列出带有前缀参数的对象的功能,您可以使用它以这种方式检查某个目录及其子目录:

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/

于 2014-03-14T08:22:59.330 回答
16

这对我有用:

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() 方法将返回一个迭代器,用于在存储桶中查找 blob。现在您可以遍历 blob 并访问存储桶中的每个对象。在这个例子中,我只是打印出对象的名称。

该文档对我帮助很大:

我希望我能帮上忙!

于 2019-04-05T08:46:26.827 回答
7

您可能还想查看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!'
于 2014-03-14T15:09:01.303 回答
3

通过 pip 或 pycharm 安装 python 包 google-cloud-storage 并使用以下代码

from google.cloud import storage
client = storage.Client()
for blob in client.list_blobs(BUCKET_NAME, prefix=FOLDER_NAME):
  print(str(blob))
于 2020-12-30T13:42:56.033 回答
1

我知道这是一个老问题,但我偶然发现了这个问题,因为我正在寻找完全相同的答案。Brandon Yarbrough 和 Abhijit 的回答对我有用,但我想了解更多细节。

当你运行这个:

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) 从文件中删除 PREFIX名称,您可以执行以下操作:

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}")
于 2021-12-08T19:11:36.197 回答