如何让 list_blob 表现得像 gsutil
Posted
技术标签:
【中文标题】如何让 list_blob 表现得像 gsutil【英文标题】:How to get list_blobs to behave like gsutil 【发布时间】:2018-12-25 00:30:23 【问题描述】:我只想在 GCS 上获得第一级的假文件夹结构。
如果我运行例如:
gsutil ls 'gs://gcp-public-data-sentinel-2/tiles/'
我得到一个这样的列表:
gs://gcp-public-data-sentinel-2/tiles/01/
gs://gcp-public-data-sentinel-2/tiles/02/
gs://gcp-public-data-sentinel-2/tiles/03/
gs://gcp-public-data-sentinel-2/tiles/04/
gs://gcp-public-data-sentinel-2/tiles/05/
gs://gcp-public-data-sentinel-2/tiles/06/
gs://gcp-public-data-sentinel-2/tiles/07/
gs://gcp-public-data-sentinel-2/tiles/08/
gs://gcp-public-data-sentinel-2/tiles/09/
gs://gcp-public-data-sentinel-2/tiles/10/
gs://gcp-public-data-sentinel-2/tiles/11/
gs://gcp-public-data-sentinel-2/tiles/12/
gs://gcp-public-data-sentinel-2/tiles/13/
gs://gcp-public-data-sentinel-2/tiles/14/
gs://gcp-public-data-sentinel-2/tiles/15/
.
.
.
在 Python API 中运行如下代码会给我一个空结果:
from google.cloud import storage
bucket_name = 'gcp-public-data-sentinel-2'
prefix = 'tiles/'
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
for blob in bucket.list_blobs(max_results=10, prefix=prefix,
delimiter='/'):
print blob.name
如果我不使用 delimiter
选项,我会在桶中得到所有结果,这不是很有用。
【问题讨论】:
【参考方案1】:也许不是最好的方法,但受到this comment on the official repository的启发:
iterator = bucket.list_blobs(delimiter='/', prefix=prefix)
response = iterator._get_next_page_response()
for prefix in response['prefixes']:
print('gs://'+bucket_name+'/'+prefix)
给予:
gs://gcp-public-data-sentinel-2/tiles/01/
gs://gcp-public-data-sentinel-2/tiles/02/
gs://gcp-public-data-sentinel-2/tiles/03/
gs://gcp-public-data-sentinel-2/tiles/04/
gs://gcp-public-data-sentinel-2/tiles/05/
gs://gcp-public-data-sentinel-2/tiles/06/
gs://gcp-public-data-sentinel-2/tiles/07/
gs://gcp-public-data-sentinel-2/tiles/08/
gs://gcp-public-data-sentinel-2/tiles/09/
gs://gcp-public-data-sentinel-2/tiles/10/
...
【讨论】:
以上是关于如何让 list_blob 表现得像 gsutil的主要内容,如果未能解决你的问题,请参考以下文章
如何让我的应用程序表现得像我正在使用 Swift 在运行时更改 Application is agent(UIElement)?