所以我有代码完成了对成像数据的分析。此代码工作正常,但数据未输出到正确的文件夹。相反,它输出的文件夹太高了。从长远来看,这显然是我想要解决的问题,但由于我在一定的时间限制下,我想在我的脚本中输入代码,只需将文件移动到我创建的正确文件夹/目录中。我已经尝试过mv和shutil命令,但它们似乎不起作用。如果有人建议如何修复/改进我将这些文件移动到正确位置的方法,我将不胜感激。如果有人建议将文件输出到错误的目录,那将是非常棒的。我对编码比较新,没有专家所以请原谅任何明显的错误。谢谢。
这是我设置目录的地方
subject_dir = os.getcwd()
dti_dir = os.path.abspath( os.path.join(subject_dir, 'dti'))
dti_input_dir = os.path.abspath( os.path.join(dti_dir, 'input'))
这是我输入一些快捷方式的地方
eddy_prefix = 'eddy'
input_path = dti_input_dir
output_prefix = 'dtifit'
output_path = '../dti/dtifit'
output_basename = os.path.abspath(os.path.join(dti_dir, output_path))
infinite_path = os.path.join(os.getenv('INFINITE_PATH'), 'infinite')
dti30 = 'dti30.nii.gz'
dti30_brain = 'bet.b0.dti30.nii.gz'
dti30_mask = 'bet.b0.dti30_mask.nii.gz'
这是我运行测试的地方。
正在运行测试,但是我的数据在dti_dir中被淘汰而不是output_basename(这是我的第二个问题)
dti = fsl.DTIFit()
dti.inputs.dwi = os.path.join(input_path, eddy_prefix + '.nii.gz')
dti.inputs.bvecs = os.path.join(input_path, eddy_prefix + '.eddy_rotated_bvecs')
dti.inputs.bvals = os.path.abspath(os.path.join(infinite_path, 'dti30.bval'))
dti.inputs.base_name = output_basename
dti.inputs.mask = os.path.join(input_path, dti30_mask)
dti.cmdline
如果不存在则创建输出目录。
这样工作正常,目录是在适当的位置创建的。
if not os.path.exists(output_basename):
os.makedirs(output_basename)
print('DTI Command line')
print(dti.cmdline)
res = dti.run()
exit()
print('DTIFIT Complete!')
在这里我尝试移动文件并收到错误:IOError: [Errno 2] No such file or directory:
即使我知道文件存在
src = dti_dir
dst = output_basename
files = os.listdir(src)
for f in files:
if (f.startswith("dtifit_")):
shutil.move(f, dst)
答案 0 :(得分:0)
您的问题最有可能发生在第一行。您可能希望将其更改为更精确,指向精确目录而不是os.getcwd()
。 os.getcwd()
将指向进程执行的任何位置,无论你何时开始python运行,它都可以改变。您可能想以某种方式对其进行硬编码。
例如,你可以使用这样的东西来指向文件所在的目录: Find current directory and file's directory
您可以考虑做的另一件事是在最后几行打印dst
并查看它是否符合您的预期。您还可以使用PDB来检查该值:
https://pymotw.com/2/pdb/
编辑:
您的问题是使用shutil.move()
的相对路径。您应该确保路径是绝对的,请参阅此答案以获取更多信息:
stackoverflow.com/a/22230227/7299836