在同一脚本中分析后尝试将数据移动到新目录
Trying to move data to a new directory after analysis in the same script
所以我有代码可以为我完成对成像数据的分析。这段代码工作正常,只是数据没有输出到正确的文件夹中。相反,它输出的文件夹太高了。这显然是我想在较长的 运行 中修复的问题,但由于我在某些时间限制下,我想将代码输入到我的脚本中,该代码只会将文件移动到我拥有的正确 folder/directory创建。我已经尝试过 mv 和 shutil 命令,但它们似乎不起作用。如果有人对如何 fix/improve 我将这些文件移动到正确位置的方法提出建议,我将不胜感激。如果有人对为什么文件被输出到错误的目录有建议,那将是很棒的。我对编码比较陌生,也不是专家,所以请原谅任何明显的错误。谢谢。
这是我设置目录的地方
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)
您的问题很可能出现在第一行。您可能希望将其更改为更精确,指向一个确切的目录而不是 os.getcwd()
。 os.getcwd()
将指向进程从何处执行,无论您从何处开始 python 运行,因此它可能会发生变化。您可能想以某种方式对其进行硬编码。
例如,您可以使用类似这样的内容来指向文件所在的目录:
Find current directory and file's directory
您可以考虑做的另一件事是在最后几行中打印出 dst
并查看它是否符合您的期望。您还可以使用 PDB 实时检查该值:
https://pymotw.com/2/pdb/
编辑:
您的问题是使用 shutil.move()
的相对路径。您应该确保路径是绝对路径,请参阅此答案以获取更多信息:
计算器。com/a/22230227/7299836
所以我有代码可以为我完成对成像数据的分析。这段代码工作正常,只是数据没有输出到正确的文件夹中。相反,它输出的文件夹太高了。这显然是我想在较长的 运行 中修复的问题,但由于我在某些时间限制下,我想将代码输入到我的脚本中,该代码只会将文件移动到我拥有的正确 folder/directory创建。我已经尝试过 mv 和 shutil 命令,但它们似乎不起作用。如果有人对如何 fix/improve 我将这些文件移动到正确位置的方法提出建议,我将不胜感激。如果有人对为什么文件被输出到错误的目录有建议,那将是很棒的。我对编码比较陌生,也不是专家,所以请原谅任何明显的错误。谢谢。
这是我设置目录的地方
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)
您的问题很可能出现在第一行。您可能希望将其更改为更精确,指向一个确切的目录而不是 os.getcwd()
。 os.getcwd()
将指向进程从何处执行,无论您从何处开始 python 运行,因此它可能会发生变化。您可能想以某种方式对其进行硬编码。
例如,您可以使用类似这样的内容来指向文件所在的目录: Find current directory and file's directory
您可以考虑做的另一件事是在最后几行中打印出 dst
并查看它是否符合您的期望。您还可以使用 PDB 实时检查该值:
https://pymotw.com/2/pdb/
编辑:
您的问题是使用 shutil.move()
的相对路径。您应该确保路径是绝对路径,请参阅此答案以获取更多信息:
计算器。com/a/22230227/7299836