Python调用mkdir创建子目录失败:subj列表变量未识别求助
解决Python调用bash mkdir时变量无法识别的问题
嗨,我来帮你搞定这个问题~你遇到的核心问题是:Python里的subj变量没有被正确嵌入到shell命令字符串中,shell把'+subj+'当成了字面量字符串,而不是你期望的受试者名称。下面给你几种简单易懂的解决方案,还会推荐更Pythonic的写法:
问题原因分析
你原来的代码里,这条命令的字符串被双引号括起来,但其中的'+subj+'只是字符串的一部分,Python不会把它解析成变量;再加上shell的单引号会把内部内容当作纯文本,所以最终执行的命令是创建名为+subj+的目录,而不是用列表里的受试者名称。
解决方案1:字符串拼接(新手友好)
把路径拆成几部分,用+把subj变量和固定字符串拼接起来,注意调整引号的位置:
os.system("mkdir -p /home/mansur/Documents/mooney/" + subj + "/anatomy/high_res")
如果担心路径里有特殊字符(比如空格),可以用单引号包裹整个路径,拼接时注意引号闭合:
os.system("mkdir -p '/home/mansur/Documents/mooney/" + subj + "/anatomy/high_res'")
解决方案2:f-string(Python3.6+推荐,最简洁)
用Python的f-string语法直接嵌入变量,写法直观又不容易出错:
os.system(f"mkdir -p '/home/mansur/Documents/mooney/{subj}/anatomy/high_res'")
解决方案3:str.format()方法(兼容旧版Python)
如果你的Python版本低于3.6,用str.format()来替换变量:
os.system("mkdir -p '/home/mansur/Documents/mooney/{}/anatomy/high_res'".format(subj))
更推荐的Pythonic写法:不用调用shell
其实Python内置了os.makedirs()函数,专门用来创建多级目录,比调用shell的mkdir更安全、跨平台,还能直接处理变量,不需要拼接shell命令:
os.makedirs(f"/home/mansur/Documents/mooney/{subj}/anatomy/high_res", exist_ok=True)
这里的exist_ok=True就相当于mkdir -p的作用——如果目录已经存在,不会抛出错误。
修改后的完整代码示例
下面是用os.makedirs()优化后的完整代码,你可以直接用:
#!/usr/bin/python import os path = '/data2/kizilirm/Mooney_fMRI_v01/subject_data' subjlist = ['di21_1028', 'dn20_1072', 'ed17_1026', 'eo56_1016', 'ge51_1039', 'ha96_1069', 'hp84_1024', 'ht02_1049', 'hw44_1051', 'ij99_1073', 'ja58_1070', 'ju49_1036', 'km61_1064', 'kr25_1034', 'lw37_1062', 'lz02_1041', 'mj45_1037', 'nm54_1017', 'od90_1040', 'ol12_1063', 'os19_1038', 'ow93_1061', 'pk62_1074', 'qq31_1068', 'qq39_1060', 'tt42_1025', 'ut93_1048', 'ws81_1042','xi27_1050', 'zd63_1035'] runlist = ['series_2_t1_mpr_sag_1iso_p2','series_3_BOLD- fMRI_2x2x(3+0.3)_p2_run1', 'series_4_BOLD-fMRI_2x2x(3+0.3)_p2_run2', 'series_5_BOLD-fMRI_2x2x(3+0.3)_p2_run3'] os.makedirs("/home/mansur/Documents/mooney", exist_ok=True) counter = 0 for subj in subjlist: for run in runlist: if run == 'series_2_t1_mpr_sag_1iso_p2': print(subj, run) counter += 1 # 这里用os.makedirs替代shell命令 os.makedirs(f"/home/mansur/Documents/mooney/{subj}/anatomy/high_res", exist_ok=True) else: continue print(counter)
内容的提问来源于stack exchange,提问作者brüto
相关产品推荐
相关产品推荐

