如何防止JSON文件中无效股票代码被API返回数据覆盖
如何在更新股票数据时保留API无法识别的无效代码?
问题分析
你的代码核心问题在于每次更新时会创建一个空的stock_info字典,仅将API返回的有效股票代码数据写入其中,最后用这个新字典覆盖原有的symbols字段——这直接导致了像ASDF这类API无法识别的无效代码被删除。
修改后的代码
import json import requests def updateStocks(api_key): try: # 读取原有数据,用with语句自动管理文件生命周期 with open('csv/stocks.json', 'r') as f: all_stocks_settings = json.load(f) stock_info = all_stocks_settings['symbols'] symbols = list(stock_info.keys()) # 构建API请求URL,用join优化字符串拼接效率 url = 'API URL' url += ','.join(symbols) url += '&apiKey=' + api_key response = requests.get(url) data = response.json() # 将API返回数据转换为以symbol为key的字典,避免嵌套循环查找 api_stock_map = {item['symbol']: item for item in data} # 仅更新有API返回数据的条目,原有无效代码条目保持不变 for symbol in symbols: if symbol in api_stock_map: stock_data = api_stock_map[symbol] stock_info[symbol] = { 'current': stock_data['price'], 'change': stock_data['change_since'], 'percent_change': stock_data['percent'] } # 写回更新后的数据,indent参数让JSON格式更易读 with open('csv/stocks.json', 'w') as f: json.dump(all_stocks_settings, f, indent=4) except Exception as e: # 建议不要静默异常,打印错误便于调试 print(f"更新失败: {str(e)}")
关键改动说明
- 保留原有字典结构:不再初始化空的
stock_info,直接基于读取到的原有字典做增量更新,确保无效代码的条目不会被清空。 - 优化数据查找逻辑:把API返回的列表转成
{symbol: 对应数据}的字典,避免嵌套循环,提升代码执行效率。 - 规范文件操作:用
with语句替代手动open/close,避免因异常导致文件未关闭的问题。 - 可选格式化输出:添加
indent=4让写入的JSON文件更易读,不影响功能逻辑。
效果验证
运行修改后的函数后,stocks.json中的ASDF等无效代码条目会被完整保留,而有效代码的价格、涨跌幅等数据会被API返回的最新值更新。
内容的提问来源于stack exchange,提问作者Pissed Off Banker
相关产品推荐
相关产品推荐

