2017-04-11 65 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

謝謝!這個鏈接非常好,我可以修復它。我沒有意識到我也需要文件的完整路徑。 –