为什么Python的try/except机制无法捕获OSError,文件校验后读入仍报错
问题原因
os.path.exists()本身不会抛出OSError异常:无论传入的路径是否存在、是否有权限访问,该函数只会返回True或False两个布尔值,不会主动触发异常,因此你写的except OSError分支永远不会被执行。- 未对
os.path.exists()的返回值做判断:你仅调用了校验函数,但没有根据返回的布尔值处理不同逻辑,不管文件是否存在,都会直接打印文件可用的提示,等于当前check方法没有实际校验作用。 - 额外的路径拼接隐患:手动拼接路径使用
+ '/' +的写法在不同操作系统下可能出现斜杠不匹配问题,推荐直接使用os.path.join()方法自动适配系统路径规则。
修复方案
方案1:修改check方法增加返回值判断
def check(self): # 自动适配系统的路径拼接 full_path = os.path.join(self.pathname, self.file) if os.path.exists(full_path): print(f"'{full_path}': 该文件可正常使用") return True else: print(f"操作系统错误:请检查文件 {self.file} 是否存在、文件名或存储路径是否正确") return False
调用时先判断check的返回结果再执行导入:
if __name__ == "__main__": table= ImportFiles("C:/Users/..s", "....csv") if table.check(): df = table.import_csv()
方案2:直接在导入逻辑中做异常捕获(更推荐)
提前做文件存在性校验可能存在竞态问题:比如校验通过后、读取文件前,文件被其他进程删除/移动,还是会报错。更稳妥的做法是跳过单独的check步骤,直接在导入CSV的逻辑中捕获异常:
def import_csv(self): full_path = os.path.join(self.pathname, self.file) try: return pd.read_csv(full_path) except FileNotFoundError: print(f"读取失败:文件 {full_path} 不存在,请检查路径和文件名") return None
内容的提问来源于stack exchange,提问作者Gwen Lee
相关产品推荐
相关产品推荐

