如何在使用GAE Python GCS客户端库进行访问时在GCS中进行分页?

时间:2015-02-25 03:09:29

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

GCS = Google云端存储
GAE = Google App Engine

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

  1. 在我的GAE Python代码中列出一些处理的所有文件?
  2. 按文件名的降序排序(在所有文件的目录中) 可以转换为数字)?
  3. 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)
    

1 个答案:

答案 0 :(得分:4)

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

然而,它严格按字母顺序产生对象信息(https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/gcsfilestat_class的实例),并且无法改变它(特别是反转顺序,正如您所希望的那样)。

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

当然可以在https://code.google.com/p/googleappengine/issues/list打开功能请求 - 目前还没有任何功能可以让GCS按照对象名称排序按字母顺序升序排序。