Python调用yfinance获取财经数据时如何从外部txt文件读取股票代码列表
问题产生原因
你修改后代码的核心错误是:通过fh.read()读取文件得到的是字符串类型数据,不是yf.download()要求的列表类型参数。
你tickers.txt里写的["aapl", "goog", "amzn", "BAC", "BA"]看起来是Python列表语法,但读取后只是普通的文本字符串,无法被yfinance识别为多股票代码列表,因此触发报错。
另外额外的不规范点:你直接用open()打开文件后没有主动关闭,会存在文件句柄泄漏的风险。
解决方法
方案1:调整txt文件格式,逐行读取股票代码(更推荐,配置更简单,无语法兼容问题)
- 先修改
tickers.txt内容,每行放一个股票代码,去掉列表相关的符号:
aapl goog amzn BAC BA
- 修改Python代码,用
with open(自动管理文件关闭)逐行读取内容,生成符合要求的代码列表:
import yfinance as yf with open("tickers.txt", "r", encoding="utf-8") as fh: # 逐行读取,去掉每行首尾的空白符、换行符,过滤空行 tickers_list = [line.strip() for line in fh if line.strip()] data = yf.download(tickers_list, start="2017-01-01", end="2017-04-30") print(data['Adj Close'])
方案2:保留当前txt格式,将读取的字符串转为Python列表
如果不想修改现有tickers.txt的内容,可以用Python标准库ast的literal_eval方法,安全地将符合Python语法的字符串转为对应的列表对象:
import yfinance as yf import ast with open("tickers.txt", "r", encoding="utf-8") as fh: content = fh.read() # 将字符串转成列表 tickers_list = ast.literal_eval(content) data = yf.download(tickers_list, start="2017-01-01", end="2017-04-30") print(data['Adj Close'])
注意:不要用
eval()做转换,eval()会执行字符串内的任意代码,存在安全风险,ast.literal_eval只会转换Python字面量结构,安全性更高。
内容的提问来源于stack exchange,提问作者M4Biz
相关产品推荐
相关产品推荐

