Python使用try-except执行os.chdir切换路径仍报FileNotFoundError问题
原代码问题说明
你贴出的try-except逻辑本身可以捕获FileNotFoundError,如果运行时仍然抛出第一个路径的不存在错误,优先排查三类问题:
- 代码缩进错误:第二个
os.chdir没有正确归属到except块下,导致异常抛出后没有进入兜底逻辑 - 路径字符串书写错误:从你贴的报错来看,路径末尾多了一个多余的右括号,说明实际运行的代码里第一个路径字符串可能混入了多余字符,路径本身不符合预期
- 裸
except写法本身是非常糟糕的实践:它会无差别捕获所有异常(包括键盘中断、内存错误等非业务异常),且如果第二个路径也不存在,你无法快速定位是哪一个路径出了问题,只会拿到第二个路径的报错,排查成本很高。
另外硬编码C://Users//xxx的写法本身兼容性极差:如果系统盘不是C盘、Windows用户目录做了迁移、或者用户名和你写的不一致,都会直接失效。
更优的跨设备路径适配方案
1. 优先用系统API获取标准目录,不要硬编码盘符和用户目录
Python自带的pathlib(Python3.4+内置)可以直接跨系统获取当前用户的主目录,不需要手动写C://Users前缀,同时会自动适配不同操作系统的路径分隔符,避免斜杠/反斜杠的兼容问题。
不要靠异常捕获做路径切换,优先主动判断路径是否存在:
from pathlib import Path import os # 自动获取当前系统的用户主目录,Windows下自动匹配当前登录用户的C:/Users/xxx路径 home = Path.home() # 把所有可能的路径按优先级列在这里,后续新增设备直接加路径即可 candidate_paths = [ home / "Cloud" / "Data", Path("D:/Cloud/Data"), # 适配系统盘在D盘的情况 Path("/Users/xxx/Cloud/Data") # 如果后续要适配macOS也可以直接加 ] # 遍历找到第一个存在的可用目录 target_dir = None for path in candidate_paths: if path.is_dir(): # 确认路径存在且是文件夹 target_dir = path break if not target_dir: raise FileNotFoundError("所有候选路径都不存在,请检查云存储目录位置") # 切换工作目录 os.chdir(target_dir)
2. 尽量不要全局切换工作目录
全局调用os.chdir会改变整个脚本的运行上下文,如果后续代码里有其他相对路径的读写逻辑,很容易因为工作目录变化出现找不到文件的问题。更稳妥的做法是把拿到的target_dir作为根路径变量,所有文件操作都基于这个绝对路径拼接,比如要读Data目录下的result.csv,直接写:
# 不需要chdir,直接拼绝对路径读写 with open(target_dir / "result.csv", "r", encoding="utf-8") as f: data = f.read()
3. 多设备长期维护建议
如果脚本要在更多设备上运行,不要把路径硬编码在代码里,可以在脚本同目录放一个简单的配置文件(比如config.ini),每台设备上只需要修改配置文件里的路径为本地实际路径,脚本统一读取配置即可,不需要在代码里维护所有设备的路径列表。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

