Python新手遇文件写入Errno 2错误,寻求解决方法
首先看你遇到的IOError: [Errno 2] No such file or directory错误,核心原因有两个,咱们逐一拆解:
1. 目标目录不存在,导致无法写入文件
你的代码直接尝试向%s/design_Rat%s_Run_%s.fsf路径写入文件,但如果fsfdir对应的目录(也就是D:/1_NEW_ANALYSIS/Scripts/Melodic_fsfs)还没有创建,Python就会抛出这个错误——它不会自动帮你生成不存在的目录。
2. 路径拆分时的索引错误(可能引发后续异常)
看这段代码:
splitdir = dir.split('\\') splitdir_sub = splitdir[1] subnum=splitdir_sub[-2:]
在Windows系统中,glob.glob返回的路径是类似D:\1_NEW_ANALYSIS\Subjects\Rat_01\Run_1这样的格式,用split('\\')拆分后,得到的列表应该是['D:', '1_NEW_ANALYSIS', 'Subjects', 'Rat_01', 'Run_1']。你现在取splitdir[1]拿到的是1_NEW_ANALYSIS,然后subnum=splitdir_sub[-2:]会得到YS,这显然不是你想要的01!这会导致后续生成的文件名错误,甚至可能在其他环节引发路径问题。
解决步骤
第一步:确保目标目录存在
在写入文件前,先检查并创建fsfdir目录,可以用os.makedirs函数(加上exist_ok=True避免目录已存在时报错):
import os import glob studydir = 'D:/1_NEW_ANALYSIS' fsfdir="%s/Scripts/Melodic_fsfs"%(studydir) templatedir="%s/Scripts/Templates"%(studydir) # 新增:创建目标目录,不存在则创建,已存在则跳过 os.makedirs(fsfdir, exist_ok=True) subdirs=glob.glob("%s/Subjects/Rat_[0-9][0-9]/Run_[0-2]"%(studydir))
第二步:修正路径拆分的索引错误
把splitdir_sub的索引改成正确的位置,拿到Rat_XX部分:
for dir in list(subdirs): splitdir = dir.split('\\') # 修正索引:取Rat_XX所在的位置,也就是splitdir[3] splitdir_sub = splitdir[3] subnum=splitdir_sub[-2:] splitdir_run = splitdir[4] runnum=splitdir_run[-1:] print(subnum) # 后续代码不变...
或者更稳妥的方式,用os.path.basename直接获取最后一级目录,避免依赖固定索引:
for dir in list(subdirs): # 获取Run_X的上级目录(Rat_XX) sub_dir = os.path.dirname(dir) splitdir_sub = os.path.basename(sub_dir) subnum = splitdir_sub[-2:] # 获取Run_X目录名 splitdir_run = os.path.basename(dir) runnum = splitdir_run[-1:] print(subnum)
这种方式不管路径深度怎么变,都能正确拿到Rat_XX和Run_X的信息,鲁棒性更强。
按照上面的步骤修改后,你的脚本应该就能正常写入文件了。
内容的提问来源于stack exchange,提问作者Annelene Dahl




