Azure ItemPaged 迭代器应该如何工作?

How should Azure ItemPaged iterator work?

我正在尝试使用以下代码从 ADLS Gen2 存储中检索所有路径:

file_system_client = service_client.get_file_system_client(file_system="my-file-system")
paths = file_system_client.get_paths()
pathlist = []
for path in paths:
    pathlist.append(path.name)

路径列表的长度为 5000。根据 documentation - 页面默认为 max_results,因为 get_pages() 的输出是 ItemPaged[PathProperties ].

现在我不明白如何处理这种输出类型以从我的文件系统中获取所有路径...

我也尝试使用by_pages()方法迭代页面,但直到只得到一页,然后分页结束:

page_iterator = paths.by_pages()
page_iterator.next()
page iterator.current_page

[list-of-PathProperties] - 5000 items

page_iterator.next()

StopIteration: End of paging

而且我肯定知道还有更多的路径需要从容器中获取。

你能帮我正确处理这个程序吗?

谢谢!

有两种迭代方式:

  • for path in file_system_client.get_paths(): 将遍历所有路径,而不是页面的概念
  • for page in file_system_client.get_paths().by_pages(): 将迭代包含路径
  • 的页面

这意味着第一个是 returning 路径的迭代器

pathlist = []
for path in paths:  # Should iterate ALL
    pathlist.append(path.name)

虽然第二个将迭代路径页面,因此您需要两个循环。例如,如果您构建网页并且需要逐页结果(如 Google/Bing 结果等)

,则此方法很有用
pathlist = []
for page in file_system_client.get_paths().by_pages():
    for path in page:
        pathlist.append(path.name)

ItemPaged 是一个迭代器,这意味着您可以将它与任何需要迭代器输入的东西一起使用。你根本不需要for

pathlist = list(file_system_client.get_paths())  # list() consumes the iterator to a list

这是针对 类 的一般行为。

现在我从您的 post 了解到您希望获得超过 5000 条路径,我认为这意味着您知道您的帐户中有更多。如果确实如此,则值得进行错误调查,因为第一个语法应该 return 全部,而不仅仅是第一页,请在此处打开一个问题:https://github.com/Azure/azure-sdk-for-python/issues

(我在微软的 Azure Python SDK 团队工作)