2017-04-11 4 views
1

J'ai donc un code qui complète une analyse pour moi sur les données d'imagerie. Ce code fonctionne correctement sauf que les données ne sont pas sorties dans le bon dossier. Au lieu de cela, il sort un dossier trop haut. C'est quelque chose que je veux évidemment réparer à long terme, mais comme je suis sous certaines contraintes de temps, je veux entrer du code dans mon script qui va simplement déplacer les fichiers dans le dossier/répertoire que j'ai créé. J'ai essayé les commandes mv et shutil mais elles ne semblent pas fonctionner. Je serais reconnaissant si quelqu'un avait une suggestion sur la façon de corriger/améliorer ma méthode de déplacement de ces fichiers à l'emplacement correct. Si quelqu'un a une suggestion pour savoir pourquoi les fichiers sont sortis dans le mauvais répertoire, ce serait génial. Je suis relativement nouveau dans le codage et aucun expert donc s'il vous plaît pardonner les erreurs évidentes. Je vous remercie.Essayer de déplacer des données vers un nouveau répertoire après analyse dans le même script

C'est là que je mets mes répertoires

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')) 

C'est là je suis entré dans quelques raccourcis

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' 

C'est là où je courais mon test.

Le test est en cours d'exécution, mais mes données sont outpputed dans dti_dir et non output_basename (c'est ma deuxième question)

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 

Création du répertoire de sortie si n'existe pas.

Cela fonctionne très bien et le répertoire est créé dans l'emplacement approprié.

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!') 

Ici j'essaie de déplacer les fichiers et je reçois l'erreur: IOError: [Errno 2] No such file or directory: même si je sais que les fichiers existent

src = dti_dir 
dst = output_basename 

files = os.listdir(src) 

for f in files: 
    if (f.startswith("dtifit_")): 
     shutil.move(f, dst) 

Répondre

0

Votre problème est très probablement dans la première ligne. Vous pouvez changer cela pour être plus exact, en pointant vers un répertoire exact plutôt que os.getcwd(). os.getcwd() pointera vers l'endroit où le processus s'exécute, où que vous ayez démarré votre exécution de python, afin qu'il puisse changer. Vous voulez probablement le coder en dur d'une manière ou d'une autre.

Par exemple, vous pouvez utiliser quelque chose comme ça, pour pointer vers le répertoire que le fichier vit dans: Find current directory and file's directory

Une autre chose que vous pourriez envisager de le faire est l'impression de dst dans vos dernières lignes et de voir si elle est ce que tu attends Vous pouvez également utiliser l'APB pour inspecter cette valeur en direct: https://pymotw.com/2/pdb/

Edit:

Votre problème utilise un chemin relatif avec shutil.move(). Vous devez vous assurer que le chemin est absolu, veuillez consulter cette réponse pour plus d'informations:

stackoverflow.com/a/22230227/7299836

+0

Salut Christopher, Merci pour votre réponse rapide. Pour la première partie de vos suggestions, j'ai oublié de mentionner une chose (très nouvelle à cela). J'ai environ 200 ensembles de données sur lesquels je lance ce code, donc je crée un fichier .txt avec les fichiers appropriés, c'est là qu'intervient os.getcwd(). Je l'ai ensuite exécuté dans une boucle for dans ma fenêtre de commande. Il ressemble à ceci: pour ii en $ (cat dtifit_test.txt); do cd $ {INFINITE_MRI_DATA}/$ {ii}; nohup nipype_dtifit.py; terminé. Pour votre deuxième partie, j'ai imprimé les variables et elles sont ce que je veux qu'elles soient. Je vais aussi regarder dans PDB merci pour cela! –

+0

Peut-être vérifier cette réponse: http://stackoverflow.com/a/22230227/7299836 Fondamentalement, shutil attend un chemin d'accès complet au fichier, pas seulement le nom du fichier que vous passez! –

+0

Merci! Ce lien était génial, j'ai pu le réparer. Je n'avais pas réalisé que j'avais aussi besoin de ce chemin complet pour le fichier. –