Liste récursive tous les fichiers du répertoire (Unix)

J’essaie de lister tous les fichiers d’un répertoire récursif en utilisant python. J’ai vu beaucoup de solutions en utilisant os.walk . Mais je ne veux pas utiliser os.walk . Au lieu de cela, je veux implémenter la récursivité moi-même.

 import os fi = [] def files(a): f = [i for i in os.listdir(a) if os.path.isfile(i)] if len(os.listdir(a)) == 0: return if len(f) > 0: fi.extend(f) for j in [i for i in os.listdir(a) if os.path.isdir(i)]: files(j) files('.') print fi 

J’essaie d’apprendre la récursivité. J’ai vu la suite de Q? A, mais je ne suis pas capable de l’implémenter correctement dans mon code.

  • Lecture récursive du répertoire Python sans os.walk

os.listdir ne renvoie que le nom de fichier (sans le chemin d’access complet). Je pense donc que les files(j) appel files(j) ne fonctionneront pas correctement.
essayez d’utiliser des files(os.path.join(dirName,j))

ou quelque chose comme ça:

 def files(a): ensortinges = [os.path.join(a,i) for i in os.listdir(a)] f = [i for i in ensortinges if os.path.isfile(i)] if len(os.listdir(a)) == 0: return if len(f) > 0: fi.extend(f) for j in [i for i in ensortinges if os.path.isdir(i)]: files(j) 

J’ai essayé de restr près de ta structure. Cependant, je l’écrirais avec une seule boucle sur les entrées, quelque chose comme ça:

 def files(a): ensortinges = [os.path.join(a,i) for i in os.listdir(a)] if len(ensortinges) == 0: return for e in ensortinges: if os.path.isfile(e): fi.append(e) elif os.path.isdir(e): files(e) 

Une autre façon de ne pas utiliser une variable globale. Cela peut être fait en utilisant ce qui suit. Je viens de modifier un peu la réponse précédente. Je pense que cela pourrait être un peu plus lisible …

 def files(a): ensortinges = [os.path.join(a,i) for i in os.listdir(a)] folders = filter(os.path.isdir, ensortinges) normalFiles = filter(os.path.isfile, ensortinges) for f in folders: normalFiles += files(f) return normalFiles