2011-03-08 3 views
3

En manipulant autour pour essayer d'automatiser certains processus, j'ai couru dans ce comportement apparemment très étrange de os.walk() de Python: quand je lui passe un certain répertoire, il ne fait rien. Cependant, quand je passe le répertoire parent, il récursse correctement dans le chemin qui ne semble pas fonctionner lorsqu'il est passé directement.os.walk ne marche pas

Par exemple:

for root, _, _ in os.walk('F:\music'): 
    print(root) 

produit la sortie suivante:

F: \ music
[...]
F: \ music \ test
F: \ music \ test \ broken
F: \ musique \ test \ cassé \ Boards_Of_Canada
F: \ music \ test \ broken \ Brian_Eno
[...]

Mais quand j'essaie avec F: \ music \ test (qui a été récursifs en très bien quand os.walk() a été appelé à son parent) en tant que tel:

for root, _, _ in os.walk('F:\music\test'): 
    print(root) 

I n'obtient aucune sortie du tout.

Quelqu'un a-t-il une idée de ce qui se passe? Est-ce que je fais quelque chose de mal? Est-ce une limitation étrange de os.walk()? Je suis vraiment confus.

+5

Le même comportement se produit-il lorsque vous utilisez '/' (barre oblique) comme séparateur de chemin? –

Répondre

18

Votre problème est ici:

for root, _, _ in os.walk('F:\music\test'): 
    print(root) 

... quand Python contenant la chaîne parse votre chemin, il interprète le \t comme un caractère de tabulation. Vous pouvez réécrire votre chaîne de chemin littéral 'f:\\music\\test' ou r'F:\music\test' (une chaîne brute, qui existe précisément pour cette raison.)

+5

C'est une raison de détester les fenêtres. –

+1

D'OOOH !!! Quelle erreur de débutant. Merci beaucoup! – joce

+2

@Jakob - une raison de beaucoup ... :) – bgporter

7

Vous devez toujours utiliser les barres obliques et non les barres obliques dans les chemins, même sur les fenêtres. Qu'est-ce qui se passe, c'est que \ t est interprété comme un onglet, pas slash-tee.

+0

jusqu'à ce que vous rencontriez '\\? \' Et que les barres obliques ne fonctionnent plus. et même chose pour la commande 'DEL' du batch, qui a échoué sur moi en utilisant des barres obliques dans les chemins. –

2

vous mieux utiliser os.path.normpath et utiliser des barres obliques et barres obliques inversées (en tout montant) vous comme non seulement aidera votre problème mais fera également votre code cross plate-forme à ce stade

pour root, _, _ dans os.walk (os.path.normpath ('F:/music/test')):