2016-09-29 1 views
1

J'ai une structure de dossiers similaire à ce qui est décrit ci-dessous.parcourir des dossiers, plusieurs sous-dossiers pour les fichiers en python

Path 
| 
| 
+----SubDir1 
|  | 
|  +---SubDir1A 
|  |  | 
|  |  |----- FileA.0001.ext 
|  |  |----- ... 
|  |  |----- ... 
|  |  |----- FileA.1001.ext 
|  |  |----- FileB.0001.ext 
|  |  |----- ... 
|  |  |----- ... 
|  |  |----- FileB.1001.ext 
|  +---SubDir1B 
     | 
|  |  |----- FileA.0001.ext 
|  |  |----- ... 
|  |  |----- ... 
|  |  |----- FileA.1001.ext 
|  |  |----- FileB.0001.ext 
|  |  |----- ... 
|  |  |----- ... 
|  |  |----- FileB.1001.ext 
+----SubDir2 
|  | 
|  |----- FileA.0001.ext 
|  |----- ... 
|  |----- ... 
|  |----- FileA.1001.ext 
|  |----- FileB.0001.ext 
|  |----- ... 
|  |----- ... 
|  |----- FileB.1001.ext 

Je veux être en mesure d'énumérer la première Filea et première FICHB pour chaque SubDir1 et SubDir2

Je l'ai regardé en ligne et vu os.walk dans une boucle, semblable à:

import os 

rootDir = '.' 
for dirName, subdirList, fileList in os.walk(rootDir): 
    print('Found directory: %s' % dirName) 
    for fname in fileList: 
     print('\t%s' % fname) 
    # Remove the first entry in the list of sub-directories 
    # if there are any sub-directories present 
    if len(subdirList) > 0: 
     del subdirList[0 

Mais cela ne semble fonctionner que s'il y a un fichier directement dans un sous-répertoire. Mon problème est que parfois il y a un sous-répertoire supplémentaire dans le sous-répertoire (!!)

Est-ce que quelqu'un a des idées pour résoudre ce problème?

+0

Vous avez dit 'J'ai regardé en ligne et j'ai vu os.walk dans une boucle for, similaire'. Alors voulez-vous dire que le code que vous mettez dans la question n'est pas le code que vous avez utilisé? –

+0

Non, j'ai utilisé ce code et bricolé avec d'autres codes qui ne fonctionnaient pas –

Répondre

0

Votre question est en fait ces deux lignes, retirez-les et vous Sould être bien:

if len(subdirList) > 0: 
    del subdirList[0] 

Explication:

Ce qu'ils font est ils font le premier sous-répertoire dans chaque répertoire disparaissent avant os.walk eu le temps de le parcourir. Il n'est donc pas surprenant que vous obteniez un comportement bizarre concernant les sous-répertoires.

est ici une illustration de ce comportement en utilisant l'arborescence suivante:

test0/ 
├── test10 
│ ├── test20 
│ │ └── testA 
│ ├── test21 
│ │ └── testA 
│ └── testA 
├── test11 
│ ├── test22 
│ │ └── testA 
│ ├── test23 
│ │ └── testA 
│ └── testA 
└── testA 

Sans les lignes problématiques:

Found directory: ./test/test0 
    testA 
Found directory: ./test/test0/test10 
    testA 
Found directory: ./test/test0/test10/test21 
    testA 
Found directory: ./test/test0/test10/test20 
    testA 
Found directory: ./test/test0/test11 
    testA 
Found directory: ./test/test0/test11/test22 
    testA 
Found directory: ./test/test0/test11/test23 
    testA 

Avec les lignes problématiques:

Found directory: ./test/test0 
    testA 
Found directory: ./test/test0/test11 
    testA 
Found directory: ./test/test0/test11/test23 
    testA 

Nous voyons donc clairement que les deux sous-dossiers test10 et test22 qui étaient les premiers en ligne ont été complètement ignorés à cause des "mauvaises lignes".