Google Cloud Storage + Python:如何列出GCS中特定文件夹的对象?

40 投票
5 回答
92798 浏览
提问于 2025-04-17 22:16

我打算写一个Python程序,用来检查某个文件是否在我的Google云存储的特定文件夹里。基本的想法是先获取这个文件夹里所有文件的列表,然后再查看文件名列表中是否有我想找的文件abc.txt

现在的问题是,似乎Google只提供了一种获取文件列表的方法,就是uri.get_bucket()。下面的代码来自于这个链接

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()的缺点是,它似乎是先获取所有的文件,这正是我不想要的。我只想获取特定文件夹(比如gs//mybucket/abc/myfolder)里的文件名列表,这样会快很多。

有没有人能帮忙解答一下?非常感谢每一个回答!

5 个回答

3

我知道这个问题已经有点老了,但我碰到这个问题是因为我在寻找同样的答案。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) 从文件名中去掉前缀,你可以这样做:

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}")
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))
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!'
24

这个方法对我有效:

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”,访问存储桶里的每一个对象。在这个例子中,我只是打印出了对象的名字。

这份文档对我帮助很大:

希望我能帮到你!

58

更新:下面的内容适用于较旧的“Google API客户端库”对于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/

撰写回答