Python解析Google Sheets多工作表时触发异常如何终止for循环
修复方案
你当前代码的核心问题有两个:
- 仅捕获了
SystemExit异常,但请求不存在的工作表时,Google Sheets API抛出的是apiclient.errors.HttpError异常,不会被现有捕获逻辑命中,所以会直接报错 - 外层循环没有判断终止条件,哪怕工作表不存在也会继续执行后续迭代
修改后的完整代码如下:
# 导入统一放到函数头部,避免重复加载 import httplib2 import pandas as pd from apiclient import discovery from apiclient.errors import HttpError # 请在此处填写你自己的Google API开发者密钥 key = "你的开发者密钥" def main_concat(id_file, n): try: discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?' 'version=v4') service = discovery.build( 'sheets', 'v4', http=httplib2.Http(), discoveryServiceUrl=discoveryUrl, developerKey=key) spreadsheetId = id_file rangeName = f'Respuestas de formulario {n}!A1:L1000' result = service.spreadsheets().values().get( spreadsheetId=spreadsheetId, range=rangeName).execute() values = result.get('values', []) if not values: print(f'工作表{n}无数据') return pd.DataFrame() # 无数据返回空DataFrame,可根据需求调整 else: df=pd.DataFrame(values) return df except HttpError as e: # 捕获工作表不存在的异常,返回None标识遍历结束 if 'Unable to parse range' in str(e): print('已遍历完所有存在的表单工作表') return None # 其他API错误照常抛出方便排查 else: raise e dfs=[] for i in range(1,200): df=main_concat('1nRAte3AH0pvLMQTg-SEkiSsy4MONJnpTADOGoDLA', i) # 收到终止信号直接跳出循环 if df is None: break dfs.append(df)
逻辑说明
- 提前导入
HttpError类专门捕获API请求错误,只有当错误是「无法解析范围」(对应工作表不存在)时才返回终止标识,其他API异常会正常抛出方便排查问题 - 外层循环每次判断返回值,如果是
None就直接终止循环,不会继续执行后续无效请求 - 导入统一放到函数外,避免每次调用函数都重复执行导入逻辑,提升运行效率
内容的提问来源于stack exchange,提问作者alb
相关产品推荐
相关产品推荐

