【问题标题】:How to paginate in GCS when using GAE Python GCS Client Library for access ?使用 GAE Python GCS 客户端库进行访问时如何在 GCS 中分页?
【发布时间】:2015-04-26 22:33:31
【问题描述】:

GCS = 谷歌云存储
GAE = 谷歌应用引擎

如果给定目录中有大量文件(模拟目录,因为不存在真实目录),我该如何管理:

  1. 列出所有文件以在我的 GAE Python 代码中进行某些处理?
  2. 按文件名降序排列(在所有文件所在的目录中) 可以转换成数字)?

listbucket() 提到了分页,但没有详细说明。我不明白如何使用listbucket() 进行分页。

我用listbucket()如下图:

import cloudstorage as gcs 
:: 
bucket_name             = os.environ.get ('BUCKET_NAME', app_identity.get_default_gcs_bucket_name ())


gcs_list_obj            = gcs.listbucket ('/' + bucket_name + '/dir_1/dir_2/', delimiter="/") 

# ITERATE THROUGH YEAR DIRECTORIES TO GET THE HIGHEST YEAR DIRECTORY NAME VALUE. 
year_list   = [] 
for item in gcs_list_obj: 
    # EACH "ITEM" WOULD BE A DIRECTORY REPRESENTING TIMESTAMP YEAR. 
    if item.is_dir: 
        # IT IS A DIRECTORY. 
        filename    = item.filename 
        # EXTRACT YEAR FROM ABSOLUTE FILENAME. 
        year_name   = "" 
        counter     = len (filename) - 2 # START AT SECOND LAST CHARACTER. 
        while (filename[counter]!="/"): 
            year_name   = filename[counter] + year_name 
            counter     = counter - 1 
        # COLLECT ALL YEAR VALUES. 
        year_list.append ( int (year_name) ) 

# SORT THEM IN DESCENDING ORDER. 
year_list   = sorted (year_list, reverse=True)

【问题讨论】:

    标签: python google-app-engine google-cloud-storage google-cloud-datastore


    【解决方案1】:

    cloudstorage.listbucket 返回一个 迭代器,因此您可以通过一次仅获取和显示 N 个项目来“分页”(例如,使用标准 Python 库中的 itertools.islice)。

    但是,它严格按字母顺序生成对象信息(https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/gcsfilestat_class 的实例),并且无法更改(尤其是颠倒顺序,如您所愿)。

    如果您必须以不同的顺序显示对象,您将不得不放弃实际的分页 - 在内存中创建一个列表然后对其进行排序,就像您现在所做的那样(然后您可以当然,呈现以“分页”方式排序的列表,但同时它占用了所有内存)。

    当然,请随时在https://code.google.com/p/googleappengine/issues/list 提出功能请求 - 目前还没有让 GCS 对事物进行排序的功能按对象名称的字母升序排列。

    【讨论】:

    • 非常感谢您的解释性回答。在将此答案标记为已接受之前,我会尝试我们的迭代器部分。按照你的建议,我开了一个Feature Request。感谢您的帮助和时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2015-03-19
    • 2019-12-18
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多