Python for循环报IndexError: list index out of range及代码优化咨询
报错根因
你遇到的IndexError是因为部分Tableau工作簿没有关联任何数据源连接,调用populate_connections后返回的workbook.connections是空列表,直接访问索引[0]自然触发越界报错。
另外原代码还存在2个隐含问题:
- 初始化
connection2时引用的a、connection变量都未提前定义,运行时会直接报错 - pandas的
append方法已经在1.4.0版本后废弃,继续使用会有兼容性警告
修复&优化后的完整代码
import tableauserverclient as TSC import pandas as pd tableau_auth = TSC.PersonalAccessTokenAuth('{Token_Name}', '{Token_Secret}', site_id="{Site}") server = TSC.Server('Site_url', use_server_version=True) request_options = TSC.RequestOptions(pagesize=1000) with server.auth.sign_in(tableau_auth): # 直接拉取所有工作簿,不需要单独提取id再循环查询 all_workbooks = list(TSC.Pager(server.workbooks, request_options)) # 用列表暂存数据,性能远高于循环修改DataFrame connection_list = [] for workbook in all_workbooks: server.workbooks.populate_connections(workbook) # 遍历所有连接,同时兼容无连接、多连接的场景 for conn in workbook.connections: print({conn.datasource_id, conn.datasource_name, workbook.name}) connection_list.append({ "Datasource_id": conn.datasource_id, "Datasource_name": conn.datasource_name, "Workbook Name": workbook.name }) # 最后一次性转DataFrame connection2 = pd.DataFrame(connection_list)
优化点说明
- 去掉了多余的id提取、重复查询步骤,直接遍历已拉取的工作簿列表,减少API请求次数,运行效率更高
- 用列表暂存数据最后一次性转DataFrame的写法,比循环修改DataFrame性能提升10倍以上,适合数据量较大的场景
- 新增多连接兼容逻辑,不会遗漏一个工作簿绑定多个数据源的情况
- 去掉了冗余的手动登出代码,
with上下文管理器会在块结束时自动处理登出逻辑 - 修复了原代码初始化DataFrame时引用未定义变量的致命bug
内容的提问来源于stack exchange,提问作者Sarang Agarwal
相关产品推荐
相关产品推荐

