如何实现带多步重试的URL CSV文件读取异常处理逻辑?
解决CSV文件404时的日期递增重试读取问题
下面是实现需求的Python代码,核心通过try-except捕获404错误,按规则递增日期重试,最多尝试3次(原日期+加1天+加2天),成功后立即终止:
import pandas as pd from urllib.error import HTTPError from datetime import datetime, timedelta def load_csv_with_retry(base_url, target_date_str, max_retries=3): # 把输入的日期字符串转成datetime对象,方便后续加减天数 target_date = datetime.strptime(target_date_str, "%Y%m%d") # 循环尝试:0次(原日期)到max_retries次(加max_retries天) for retry_count in range(max_retries + 1): current_attempt_date = target_date + timedelta(days=retry_count) current_date_str = current_attempt_date.strftime("%Y%m%d") full_csv_url = f"{base_url}/{current_date_str}.csv" try: # 尝试读取CSV并转成DataFrame df = pd.read_csv(full_csv_url) print(f"✅ 成功读取:{full_csv_url}") return df except HTTPError as e: if e.code == 404: if retry_count < max_retries: print(f"❌ {full_csv_url} 不存在(404),下次尝试日期:{current_attempt_date + timedelta(days=1).strftime('%Y%m%d')}") else: print(f"❌ 已重试{max_retries}次,所有日期的文件均无法找到") # 所有尝试失败时,返回None供调用方判断,也可根据需求抛出自定义异常 return None else: # 非404的HTTP错误(如500、403),直接抛出不重试 raise # ------------------------ # 示例调用 # ------------------------ if __name__ == "__main__": # 替换成你的实际基础URL base_url = "https://your-domain.com/data-files" # 你最初想要尝试的日期 initial_target_date = "20240601" df = load_csv_with_retry(base_url, initial_target_date) if df is not None: # 读取成功后的后续处理 print("DataFrame预览:") print(df.head()) else: # 所有重试失败后的处理逻辑,比如记录日志、告警等 print("无法获取有效CSV文件,请检查日期范围或URL配置")
关键逻辑说明
日期递增规则:
- 第1次尝试:传入的原日期(对应示例中的madels.csv)
- 第2次尝试:原日期+1天(对应modals.csv)
- 第3次尝试:原日期+2天(对应medals.csv)
- 最多尝试3次(含原日期),符合需求中的「最多3天」要求
异常处理边界:
- 只针对
HTTPError 404做重试,其他HTTP错误(如服务器错误500、权限错误403)直接抛出,避免无效重试 - 每次失败后打印提示,最后一次失败返回
None,方便调用方做后续处理
- 只针对
终止逻辑:
- 一旦成功读取到CSV文件,立刻
return终止循环,不会继续尝试后续日期
- 一旦成功读取到CSV文件,立刻
内容的提问来源于stack exchange,提问作者Anoushiravan R
相关产品推荐
相关产品推荐

