如何让 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的主要内容,如果未能解决你的问题,请参考以下文章

Python Enum:如何让枚举成员表现得像零一样?

如何让我的应用程序表现得像我正在使用 Swift 在运行时更改 Application is agent(UIElement)?

让 Airflow 表现得像 Luigi:如果任务的输出只需要获得一次,如何防止任务在 DAG 的未来运行中重新运行?

让 div 表现得像 iframe

让IE 8表现得像IE 7

在 iphone 上查看时,如何使我的桌面选择列表表现得像 ios 选择器?