2017-04-11 53 views
1

所以我有影像学资料完成分析我的代码分析后,将数据移动到一个新的目录。此代码工作正常,但数据未输出到正确的文件夹中。相反,它输出的文件夹太高。这事我当然希望从长远看来解决,但因为我在一定的时间限制,我想输入代码到我的脚本,将只需将文件移动到我创建了正确的文件夹/目录。我已经尝试了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被outpputed而不是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

你的问题是最有可能在第一行。您可能希望将其更改为更准确,指向一个确切的目录而不是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

+0

嗨克里斯托弗, 感谢您的快速响应。对于你的建议的第一部分,我忘了提一件事(对此很新颖)。我有大约200组数据运行此代码,因此我使用正确的文件创建了一个.txt文件,以便os.getcwd()进入其中。然后我在我的命令窗口中的for循环中运行它。它看起来像这样:for $ in(cat dtifit_test.txt);做cd $ {INFINITE_MRI_DATA}/$ {ii}; nohup nipype_dtifit.py;完成。 关于你的第二部分,我并打印变量,它们是什么,我希望他们能。我也会考虑PDB谢谢你! –

+0

也许看看这个答案: http://stackoverflow.com/a/22230227/7299836 基本上,shutil期望文件的完整路径,而不仅仅是你传入的文件名! –

+0

谢谢!这个链接非常好,我可以修复它。我没有意识到我也需要文件的完整路径。 –