使用 GAE Python GCS Client Library 进行访问时如何在 GCS 中分页?
How to paginate in GCS when using GAE Python GCS Client Library for access ?
GCS = Google 云存储
GAE = Google 应用引擎
如果给定目录(模拟目录,因为不存在真实目录)中有大量文件,我该如何管理:
- 列出我的 GAE Python 代码中某些处理的所有文件?
- 按文件名降序排列(在所有文件所在的目录中
可以转换为数字 ) ?
listbucket() mentions about pagination but does not elaborate. I do not understand how to paginate using 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)
cloudstorage.listbucket
returns 一个 迭代器 所以你可以 "paginate" 通过一次只获取和显示 N 项(例如 itertools.islice
来自标准 Python 库)。
但是它严格按照字母顺序生成对象信息(https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/gcsfilestat_class
的实例),并且没有办法改变它(特别是颠倒顺序,就像你想要的那样)。
如果您必须以某种不同的顺序显示对象,您将不得不放弃实际的分页——在内存中创建一个列表然后对其进行排序,就像您正在做的那样现在(然后你当然可以 以 "paginated" 的方式呈现 排序列表,但同时它占用了所有内存)。
当然可以在 https://code.google.com/p/googleappengine/issues/list 打开一个功能请求——目前还没有让 GCS 对事物进行排序的功能 但是 按对象名称的字母升序.
GCS = Google 云存储
GAE = Google 应用引擎
如果给定目录(模拟目录,因为不存在真实目录)中有大量文件,我该如何管理:
- 列出我的 GAE Python 代码中某些处理的所有文件?
- 按文件名降序排列(在所有文件所在的目录中 可以转换为数字 ) ?
listbucket() mentions about pagination but does not elaborate. I do not understand how to paginate using 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)
cloudstorage.listbucket
returns 一个 迭代器 所以你可以 "paginate" 通过一次只获取和显示 N 项(例如 itertools.islice
来自标准 Python 库)。
但是它严格按照字母顺序生成对象信息(https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/gcsfilestat_class
的实例),并且没有办法改变它(特别是颠倒顺序,就像你想要的那样)。
如果您必须以某种不同的顺序显示对象,您将不得不放弃实际的分页——在内存中创建一个列表然后对其进行排序,就像您正在做的那样现在(然后你当然可以 以 "paginated" 的方式呈现 排序列表,但同时它占用了所有内存)。
当然可以在 https://code.google.com/p/googleappengine/issues/list 打开一个功能请求——目前还没有让 GCS 对事物进行排序的功能 但是 按对象名称的字母升序.