Google Cloud Storage + Python:如何列出GCS中特定文件夹的对象?
我打算写一个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 个回答
我知道这个问题已经有点老了,但我碰到这个问题是因为我在寻找同样的答案。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}")
通过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))
你可能还想看看 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!'
这个方法对我有效:
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”,访问存储桶里的每一个对象。在这个例子中,我只是打印出了对象的名字。
这份文档对我帮助很大:
希望我能帮到你!
更新:下面的内容适用于较旧的“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/