Python脚本在运行对话框报FileNotFoundError,命令行/IDE正常
问题分析与解决:运行对话框执行Python脚本时的文件找不到错误
核心原因:工作目录不一致
在PyCharm或Windows命令行运行脚本时,程序的工作目录默认是脚本所在文件夹,用相对路径'QB_stats.xlsx'能正确定位文件。但通过运行对话框(Win+R)执行时,系统默认工作目录是你的用户主目录(比如C:\Users\你的用户名),脚本会去这个目录查找Excel文件,自然找不到,从而抛出FileNotFoundError。
代码问题与改进建议
1. 修复文件路径问题(解决报错的关键)
用绝对路径替代相对路径,确保无论在哪里运行都能定位到Excel文件。借助os模块获取脚本所在目录,再拼接文件路径:
# 在被调用脚本顶部导入os模块 import os # 获取当前脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接QB_stats.xlsx的绝对路径 qb_excel_path = os.path.join(script_dir, 'QB_stats.xlsx') # 后续加载和保存都使用该变量 wb = openpyxl.load_workbook(qb_excel_path) # ... wb.save(qb_excel_path)
2. 修复未定义变量错误
被调用脚本中wb = openpyxl.load_workbook(file_path)的file_path是未定义变量,直接替换为上面的qb_excel_path即可。
3. 优化异常处理
原代码用except:捕获所有异常,会掩盖真正的问题(比如网页结构变化、网络错误)。建议捕获特定异常并添加明确提示:
try: tag = 'switcher_passing' main = doc.find(id=tag) table = main.find(id='div_passing') data = table.find(id='passing') stats = data.find('tbody') except AttributeError: print(f"无法找到{tag}标签,尝试备用标签") tag = 'all_passing' main = doc.find(id=tag) if not main: print("无法获取球员数据,请检查URL或网页结构") return "失败:无法获取数据" table = main.find(id='div_passing') data = table.find(id='passing') stats = data.find('tbody')
4. 加强参数验证
主脚本参数处理存在漏洞:若用户传入参数但数量不足(比如只传名字没传位置)会直接报错,提前添加判断更友好:
if len(sys.argv) > 1: if len(sys.argv) < 4: print("参数错误:需要传入 名 姓 位置(例如:Tom Brady QB)") sys.exit(1) name = f"{sys.argv[1]} {sys.argv[2]}" pos = sys.argv[3] if pos not in positions: print(f"无效位置,可选位置:{', '.join(positions)}") sys.exit(1) else: name = input('Enter player name: ') pos = input('Enter play position (Example: WR, QB, etc.): ')
5. 移除冗余操作
被调用脚本重复加载了两次工作簿,删除第一次加载的代码,仅保留一次即可。
6. 优化Excel写入循环
原嵌套循环会导致重复写入数据,改为更高效的映射方式:
# 建立工作表名与工作表对象的映射 sheet_map = {sheet_name: wb[sheet_name] for sheet_name in wb.sheetnames} # 遍历统计数据,找到对应工作表写入 for year_stat in total_stats: year_str = str(year_stat[1]) if year_str in sheet_map: sheet_map[year_str].append(year_stat)
内容的提问来源于stack exchange,提问作者martymcflynn
相关产品推荐
相关产品推荐

