如何获取Python中的下一个blob Google云存储库方法列表\u blob

如何获取Python中的下一个blob Google云存储库方法列表\u blob,python,google-cloud-storage,Python,Google Cloud Storage,在我看来,google.cloud.storage.Client::list_blobs返回的HTTPIterator不是一个合适的python迭代器。见下文: 将google.cloud.storage导入为gcs client=gcs.client() blobs=客户机。列表\u blobs(“mybucket”) blob=next(blobs)#TypeError:'HTTPIterator'对象不是迭代器 blob=blobs.\uuuuuuuuuuuuuuuuuu()\Attrib

在我看来,
google.cloud.storage.Client::list_blobs
返回的
HTTPIterator
不是一个合适的python迭代器。见下文:

将google.cloud.storage导入为gcs
client=gcs.client()
blobs=客户机。列表\u blobs(“mybucket”)
blob=next(blobs)#TypeError:'HTTPIterator'对象不是迭代器
blob=blobs.\uuuuuuuuuuuuuuuuuu()\AttributeError:'HTTPIterator'对象没有属性'\uuuuuuuuuuuuuuuu'

我正在寻找一个不遍历整个迭代器的解决方案。我能想到的唯一解决方案是一个愚蠢的破解:在第一个循环之后进行循环和中断。

如果不了解页面迭代器的详细信息,您只需将迭代器转换为列表:

blobs = client.list_blobs(bucketName)
blob_list = list(blobs)

# First blob
blob_list[0].name

# Second blob
blob_list[1].name

# Of course you can check the number of list items with len()
count = len(blob_list)

实际上,重要的是要理解函数
list\u blobs()
不能一次获取所有内容。通常,库一次将获取1000个对象。这称为分页。假设一个bucket有1500个对象,将通过迭代获取两页对象(1000个对象和500个对象)。但是,返回的对象可能少于1000个

blobs = client.list_blobs(bucketName)
for page in blobs.pages:
        print('Page number: ', blobs.page_number)
        print('Count:       ', page.num_items)
输出:

Page number:  1
Count:        1000
Page number:  2
Count:        500
将页面迭代器转换为列表时,将获取所有对象。对于大型存储桶,仅显示第一个和下一个对象可能需要大量时间

为了更好地理解,请研究页面迭代器的源代码


可能是
iter(blobs)。\uuuu next\uuuu()
?或者
next(iter(blobs))
您的第一个解决方案不满足“不遍历整个迭代器的解决方案”。强制转换到列表可以有效地做到这一点,因为它需要遍历每个元素来创建该列表。但是,您确实提供了一个想法,调用
next(blobs.pages)
并获取该页面中的第一项。然而,如果你想得到第二、第三、第四等等,迭代逻辑就变得很困难,直到第(N-1)位,其中N是最大的blob数。“实际上,重要的是要理解函数list_blobs()不能一次获取所有的东西。”是的,我确实想要这个属性。例如,假设您希望“在不遍历整个bucket的情况下查找bucket中的前N个对象”。@keto-在我的第二个示例中,使用页面迭代器并在页面中进行迭代。一旦你读过了你想要的,就爆发出来。否则,您无法按自己的意愿使用该库,因此必须编写自己的代码。