如何循环调用pyxero接口获取所有分页发票数据并合并为列表?
循环获取pyxero所有分页发票数据的解决方案
嘿,作为刚接触pyxero的新手,这个分页获取的需求其实挺常见的,我来给你写个简单易懂的实现方案,保证能搞定~
核心思路
因为Xero的API在没有更多数据时会返回空列表[],所以我们可以从第1页开始循环请求,每次把当前页的数据合并到总列表里,直到拿到空列表就停止循环。
完整代码示例
# 初始化一个空列表,用来存储所有分页的发票数据 all_invoices = [] current_page = 1 # 无限循环,直到拿到空数据就退出 while True: # 请求当前页的发票 page_data = xero.invoices.filter(page=current_page) # 如果当前页没有数据,说明已经取完所有分页了,跳出循环 if not page_data: break # 将当前页的发票数据合并到总列表里(用extend而不是append,避免嵌套列表) all_invoices.extend(page_data) # 页码加1,准备请求下一页 current_page += 1 # 验证结果:打印总条数 print(f"成功获取到所有发票,总共 {len(all_invoices)} 条")
关键细节说明
extend()vsappend():一定要用extend(),因为append()会把整个当前页的列表作为一个元素塞进总列表,最后你得到的是[[页1数据], [页2数据]]这种嵌套结构,而extend()会把当前页的每个字典元素逐个添加到总列表,最终得到的是扁平的字典列表,也就是你想要的结果。- 循环终止条件:当
xero.invoices.filter()返回空列表时,说明已经没有更多分页数据了,直接break退出循环就行。 - 可选:API速率限制处理:如果你的发票数据量很大,频繁请求可能触发Xero的API速率限制,这时候可以在循环里加个小延迟,比如导入
time模块后,在current_page += 1之前加一行time.sleep(1),让请求间隔1秒,避免被限流。
这样处理之后,all_invoices就是合并了所有分页数据的大列表啦,后续你就可以直接用这个列表做数据处理了~
内容的提问来源于stack exchange,提问作者DBa
相关产品推荐
相关产品推荐

