Python循环调用ChatGPT写入DataFrame:如何保存进度与处理异常?
改进后的批量调用ChatGPT API代码
import pandas as pd import time import openai from openai.error import APIError, RateLimitError, ConnectionError, Timeout # 初始化OpenAI API密钥(根据实际情况配置) # openai.api_key = "your-api-key" # 读取数据:优先加载已保存的进度文件,无则读取原始数据 try: df2500 = pd.read_csv('chatGPT-SG-part1-2500.csv') if 'summarized' not in df2500.columns: df2500['summarized'] = pd.NA except FileNotFoundError: df2500 = pd.read_csv('your-original-data.csv') # 替换为你的原始数据路径 df2500['summarized'] = pd.NA # 只处理未完成的行(summarized为空的条目) for idx, row in df2500[df2500['summarized'].isna()].iterrows(): phrase = row['phrase'] try: # 调用ChatGPT API response = openai.ChatCompletion.create( model="gpt-3.5-turbo", temperature=0.3, messages=[{"role": "user", "content": phrase}], # 建议用user角色匹配用户输入场景 max_tokens=2500 ) # 提取并保存结果 result = response['choices'][0]['message']['content'].strip() df2500.at[idx, 'summarized'] = result print(f"完成第{idx+1}条数据处理") except (APIError, RateLimitError, ConnectionError, Timeout) as e: print(f"第{idx+1}条数据处理失败: {str(e)}") df2500.at[idx, 'summarized'] = f"Error: {str(e)}" except Exception as e: print(f"第{idx+1}条数据发生未知错误: {str(e)}") df2500.at[idx, 'summarized'] = f"Unknown Error: {str(e)}" # 每次处理完立即保存进度 df2500.to_csv('chatGPT-SG-part1-2500.csv', index=False) time.sleep(5) print("所有数据处理完成")
核心改进说明
1. 实时保存已处理数据
- 启动时优先读取已生成的CSV文件,若之前程序中断,可直接从上次进度继续,无需重复处理已完成条目
- 每处理完一行(无论成功或失败),立即调用
to_csv保存DataFrame,确保已处理数据随时可恢复 - 通过筛选
summarized为空的行,避免重复调用API浪费资源
2. 捕获错误并持续循环
- 用
try-except块包裹API调用,针对性捕获OpenAI常见异常(服务器错误、速率限制、网络故障、超时等) - 遇到错误时记录错误信息到结果列,打印提示后直接进入下一次循环,不中断整体流程
- 额外捕获通用
Exception处理未预见的错误,避免程序意外终止
额外优化
- 将消息角色从
system改为user,更符合ChatGPT的交互逻辑(system多用于定义助手行为,用户输入用user角色更合理)
内容的提问来源于stack exchange,提问作者gyinshen
相关产品推荐
相关产品推荐

