Python yfinance导出股票数据至CSV函数运行打印bad排查
股票数据下载函数异常排查方案
故障背景
- 实现目标:编写Python函数拉取过去12个月的股票行情数据,导出为本地CSV文件
- 故障表现:测试调用
download_stock('AAPL')时,代码始终进入异常分支打印bad,无法定位具体错误
原实现代码:
import pandas as py import numpy as np import yfinance as yf import datetime as dt from pandas_datareader import data as pdr from yahoofinancials import YahooFinancials yf.pdr_override() now_time=dt.datetime.now() start_time = dt.datetime(now_time.year - 1, now_time.month , now_time.day) bad_names=[] def download_stock(stock): try: print(stock) stock_df = pdr.get_yahoo_data(stock, start_time, now_time) stock_df['Name'] = stock output_name = stock + '_data.csv' stock_df.to_csv("./stocks/"+output_name) except: bad_names.append(stock) print('bad: %s' % (stock)) download_stock('AAPL')
核心问题点
- 裸异常捕获完全吞掉了错误栈:不带异常类型、不打印错误详情的
except:写法会屏蔽所有报错信息,是无法定位问题的核心原因 - 调用方法名拼写错误:
yf.pdr_override()生效后,pdr模块拉取雅虎数据的方法是get_data_yahoo(),原代码写的get_yahoo_data()方法不存在,会直接触发AttributeError - 导出路径未做存在性校验:代码指定导出到
./stocks/目录,如果运行前未手动创建该文件夹,to_csv()会触发FileNotFoundError - 存在冗余导入:
pandas(别名py)、numpy、YahooFinancials三个导入项全程未被使用,不影响运行但属于无效代码
修正后可运行代码
import os import datetime as dt import yfinance as yf from pandas_datareader import data as pdr yf.pdr_override() now_time = dt.datetime.now() start_time = dt.datetime(now_time.year - 1, now_time.month, now_time.day) bad_names = [] # 提前创建导出目录,不存在则自动生成 if not os.path.exists("./stocks"): os.makedirs("./stocks") def download_stock(stock): try: print(stock) # 修正方法名拼写 stock_df = pdr.get_data_yahoo(stock, start=start_time, end=now_time) stock_df['Name'] = stock output_name = f"{stock}_data.csv" stock_df.to_csv(f"./stocks/{output_name}") print(f"{stock} 数据下载完成,已保存到stocks目录") except Exception as e: # 打印具体错误信息方便排查 bad_names.append(stock) print(f"下载{stock}失败,错误原因:{repr(e)}") download_stock('AAPL')
排查通用建议
- 调试阶段禁止使用裸
except:,必须捕获具体异常类型并打印完整错误栈,否则完全无法定位问题 - 涉及文件读写操作时,必须提前校验目标路径是否存在,不要依赖手动提前创建文件夹
- 调用第三方库方法前确认方法名拼写,注意
yfinance覆盖pdr接口后的方法名变更
内容的提问来源于stack exchange,提问作者Reid
相关产品推荐
相关产品推荐

