2012-02-23 1 views
0

J'ai besoin d'un programme qui prend comme paramètres le nom d'un fichier et le chemin d'un dossier et recherche le fichier dans le dossier et tout dossier qu'il contient, directement ou indirectement. La fonction doit renvoyer le chemin d'accès du fichier, s'il est trouvé, ou None si le fichier ne peut pas être trouvé dans le dossier ou dans un sous-répertoire du dossier. La fonction doit être récursive.Renvoyer récursivement le chemin d'accès du fichier

voici mon code:

def search(fname, path): 

    for item in os.listdir(path): 
     next = os.path.join(path, item) 
     try: 
      search(next,fname) 
     except: 
      return next 

il devrait ressembler à quelque chose le long des lignes de:

>>>search('fileA.txt', 'test') 
'test\\fileA.txt' 
>>>search('fileB.txt', 'test') 
'text\\folder2\\fileB.txt' 

ect. mais je ne peux obtenir mon code que pour trouver fichierA.txt, peu importe le fichier que je lui dis de chercher.

je demandé à l'enseignant de l'aide, voici ce qu'elle m'a dit:

** Je vois plusieurs problèmes:

  1. Vous n'avez pas une condition dans votre fonction qui vérifie réellement voir si vous avez trouvé le fichier. Voir le prochain numéro lorsque vous travaillez à changer cela.
  2. Le nom f ne correspond pas au fichier qui lui correspond si vous l'avez déjà ajouté. Vous devez vérifier le nom du fichier avant de créer le chemin complet du fichier, sinon vous ne pourrez pas le faire.
  3. Vous ne faites rien avec les valeurs renvoyées par l'appel récursif. Ceux-ci doivent renvoyer soit des chemins, soit Aucun, et vous ne vérifiez pas ce qui revient. **
+1

Pourquoi utilisez-vous 'try' /' except'? Je pense que vous cherchez 'if' /' else'. –

+0

s'il vous plaît élaborer? – AngelE

Répondre

2

Vos éléments récursifs sont mélangés. Essayez search(fname, next).

Aussi, comme mentionné par Brendan, vous devriez utiliser if/else, et non try/except, puisqu'aucune erreur n'a été levée ici. Et enfin, vous ne semblez pas avoir de cas de base (par exemple, pas d'autres répertoires à parcourir), une condition finale qui terminera la récursivité et empêchera la boucle/récursion infinie.

1

Vous pouvez utiliser os.walk() pour ce faire:

import os 

def search(fname, path): 
    for root, dirs, files in os.walk(path): 
     if fname in files: 
      return os.path.join(root, file) 
     else: 
      return None 
+0

Je pensais à ajouter cela, mais je suppose que l'enseignant veut qu'ils réinventent 'os.walk'. – Edwin

+0

Juste point, devrait avoir compris qu'il était pour une affectation par le "exigence" d'être récursif. – aravenel

+0

Oui, il doit être récursive malheureusement, et j'ai toujours des problèmes: / – AngelE

0

Vous avez besoin d'une condition de terminaison de récursivité. Pensez aux conditions dans lesquelles la fonction devrait revenir et aux conditions dans lesquelles elle devrait continuer à chercher. Ensuite, écrivez un bloc if/else pour tester ces conditions. Si la condition de retour est valide, renvoyez la valeur correcte. Sinon, renvoyez le résultat d'un appel récursif. En d'autres termes, il devrait ressembler à ceci (schématiquement):

def search(old_args) 
    if condition: 
     return 'value' # recursion terminates and value is returned 
    else:    # all the way down the call stack 
     return search(new_args) # continue recursion until `condition` holds & 
           # pass the result down the stack with `return`