Python使用glob后调用os.path.join拼接路径报FileNotFoundError如何解决
问题根因
你的故障和glob模块完全无关,核心是代码中随意修改全局当前工作目录(os.chdir)导致的相对路径计算错误。
错误逻辑拆解
你编写的get_last_file函数存在严重的路径逻辑漏洞:
- 进入目标文件夹时调用了
os.chdir(folder)修改全局工作目录 - 处理完成后固定写死跳转
os.chdir(os.path.join("..", ".."))回退两级目录,完全没有适配传入的folder参数的实际路径层级。只要传入的folder不是刚好位于初始工作目录的下一级/下两级,执行完函数后当前工作目录就会跳到预期之外的位置。
异常现象解释
你遇到的「手动赋值文件名拼接路径依然报错」的现象,正是工作目录被修改导致的:
只要调用过一次get_last_file,当前工作目录就已经被篡改,后续所有相对路径的计算都是基于错误的目录,哪怕你手动写死文件名拼接data/1109.csv,这个相对路径也是相对于改乱后的工作目录,自然找不到对应文件。
你可以在调用函数前后分别执行print(os.getcwd()),就能直观看到目录的异常变化。
修复方案
彻底删除代码中的os.chdir操作,不要靠修改全局工作目录处理路径,glob本身支持直接传入路径前缀匹配文件,不需要切换目录:
import glob import os from datetime import datetime def get_last_file(folder, date=datetime.today().date()): # 直接构造csv文件匹配规则,不需要切换工作目录 csv_pattern = os.path.join(folder, "*.csv") _files = glob.glob(csv_pattern) # 按创建时间升序排序 _files.sort(key=os.path.getctime) date_str = "".join(str(date).split("-")) # 倒序查找匹配日期的文件 for file_path in reversed(_files): filename = os.path.basename(file_path) if date_str in filename: # 按需返回文件名或者全路径,返回全路径的话后续不需要再拼接 return filename # 无匹配时返回最新文件的文件名 return os.path.basename(_files[-1])
注意事项
- 如果业务需要直接使用全路径,函数内可以直接返回
file_path,不需要后续再手动拼接,进一步降低出错概率 - 全局修改工作目录是非常危险的编码实践,除非你完全清楚上下文影响,否则不要随意使用
- glob模块本身没有稳定性问题,不需要避免使用
内容的提问来源于stack exchange,提问作者JanisE
相关产品推荐
相关产品推荐

