如何确认CSV或通用文件已加载至Python脚本?代码报错排查
解决交互式菜单中文件加载状态判断的问题
我来帮你搞定这个问题——你的代码目前有两个关键问题:变量作用域导致的filename未定义错误,以及错误地用sys.modules判断数据是否加载。咱们一步步修正:
核心问题分析
- 变量作用域问题:
filename是在choice == 1的while循环内部定义的,如果用户一开始就选choice == 2,这个变量根本没被创建,自然会报错。 - 判断逻辑错误:
sys.modules是用来存储Python已导入的模块的,和你加载的CSV数据完全没关系,用它判断数据是否加载完全不对。
正确的解决方案
我们可以通过初始化一个全局状态变量来跟踪数据是否成功加载,而不是依赖文件名。这里用loaded_data(初始值为None)来存储加载后的DataFrame,只要它不为None,就说明数据已有效加载。
修改后的完整代码示例
import os import pandas as pd import sys # 初始化数据加载状态:None表示未加载 loaded_data = None filename = None # 提前初始化filename,避免作用域问题 while True: # 显示菜单 print("\n=== 交互式菜单 ===") print("1. 加载CSV数据") print("2. 检查数据错误") print("3. 退出") choice = int(input("请输入选择(1-3):")) if choice == 1: while True: filename = input("请输入CSV文件名:") # 检查文件是否存在于当前目录 if os.path.exists(filename): try: # 尝试加载CSV,捕获可能的格式错误 loaded_data = pd.read_csv(filename) print("\n数据已成功加载!") break except pd.errors.EmptyDataError: print("\n错误:文件是空的,请选择其他文件。") except pd.errors.ParserError: print("\n错误:文件不是有效的CSV格式,请检查。") except Exception as e: print(f"\n加载失败:{str(e)}") else: print("\n文件不存在,请重新输入。") elif choice == 2: # 通过loaded_data判断是否已加载有效数据 if loaded_data is None: print("请先加载数据文件!") else: # 这里写你的错误检查逻辑 print("开始检查数据错误...") # 示例:检查缺失值 missing_values = loaded_data.isnull().sum().sum() print(f"数据中共有{missing_values}个缺失值") elif choice == 3: print("退出程序。") break else: print("无效选择,请输入1-3之间的数字。")
关键改动说明
- 状态变量
loaded_data:用它存储加载后的DataFrame,初始为None,加载成功后赋值为实际数据。后续所有需要依赖已加载数据的操作,都通过判断loaded_data is not None来确认。 - 提前初始化
filename:在菜单循环前定义filename = None,避免用户未选1就选2时出现未定义错误。 - 增加异常捕获:在加载CSV时捕获
EmptyDataError、ParserError等异常,确保即使文件存在,也能处理无效CSV的情况,保证loaded_data只在数据有效时才被赋值。 - 替换错误的判断逻辑:去掉
sys.modules的错误用法,改用loaded_data的状态来判断,这才是真正可靠的方式——因为文件名存在不代表数据加载成功(比如文件损坏、格式错误)。
额外建议
- 如果需要支持通用文件(不止CSV),可以扩展加载逻辑,根据文件后缀调用不同的加载函数(比如
pd.read_excel处理Excel文件),但核心思路还是用loaded_data来跟踪加载状态。 - 可以把文件加载逻辑封装成单独的函数,让代码更模块化,比如:
def load_file(file_path): if not os.path.exists(file_path): return None, "文件不存在" try: if file_path.endswith(".csv"): data = pd.read_csv(file_path) elif file_path.endswith(".xlsx"): data = pd.read_excel(file_path) else: return None, "不支持的文件格式" return data, None except Exception as e: return None, f"加载失败:{str(e)}"
内容的提问来源于stack exchange,提问作者Edin Mahmutovic
相关产品推荐
相关产品推荐

