2015-10-17 6 views
7

sto cercando di effettuare le seguenti operazioni, in questo ordine:Rendere il lavoro os.walk in modo non standard

Usa os.walk() a scendere ogni directory.
Ogni directory ha subfolders, ma sono interessato solo al primo subfolder. Ecco come appare la directory:

/home/RawData/SubFolder1/SubFolder2 

Ad esempio. Voglio, in RawData2, avere cartelle che si fermano al livello SubFolder1.

Il fatto è che sembra che os.walk() passi attraverso TUTTA la cartella RawData e non sono sicuro di come fermarlo.

Il seguente è ciò che ho fino ad ora - ho provato un certo numero di altre combinazioni di dirs variabili sostitutive per root o file, ma ciò non sembra ottenere ciò che voglio.

import os 

for root, dirs, files in os.walk("/home/RawData"): 

    os.chdir("/home/RawData2/") 
    make_path("/home/RawData2/"+str(dirs)) 
+0

Non è chiaro che cosa vuoi dire, può spiegare di più? – Kasramvd

+0

Bene, os.walk() passa attraverso tutti i livelli di RawData e delle sottocartelle associate. Mi interessa che scenda solo di un livello, invece di tutti. Forse una funzione diversa sarebbe più appropriata? –

+0

Forse [glob] (https://docs.python.org/3.4/library/glob.html#module-glob) sarebbe un'alternativa utile? – swenzel

risposta

1

Ti suggerisco di utilizzare glob invece.

come la guida in glob descrive:

glob(pathname) 
    Return a list of paths matching a pathname pattern. 

    The pattern may contain simple shell-style wildcards a la 
    fnmatch. However, unlike fnmatch, filenames starting with a 
    dot are special cases that are not matched by '*' and '?' 
    patterns. 

Così, il vostro modello è ogni primo directory di livello, che mi credo sarebbe qualcosa di simile:

/root_path/*/sub_folder1/sub_folder2 

Quindi, si inizia alla radice, ottieni tutto in quel primo livello, quindi cerca sub_folder1/sub_folder2. I pensa a che funziona.

Per mettere tutto insieme:

from glob import glob 

dirs = glob('/root_path/*/sub_folder1/sub_folder2') 

# Then iterate for each path 
for i in dirs: 
    print(i) 
+0

Il fatto è che ho bisogno di sub_folder2 per essere qualcosa che itera su un mucchio di diverse cartelle. Non sono sicuro che il tuo metodo lo farebbe. –

+0

Quindi quello che stai dicendo è che vuoi passare attraverso tutte le sottodirectory della partita filtrata? Quindi, se hai filtrato/root_path/*/sub1/sub2. Quindi vuoi prendere ciascuno di questi e scorrere ognuno di questi per ogni altra cosa in quei percorsi? – idjaw

1

Attenzione: Documentazione per os.walk dice:

non cambiare la directory di lavoro corrente tra riprese di cammino(). a piedi() cambia mai la directory corrente, e assume che il suo interlocutore non lo fa neanche

modo si dovrebbe evitare os.chdir("/home/RawData2/") nel ciclo walk.

Si può facilmente chiedere walk non ricorsivamente utilizzando topdown=True e compensazione dirs:

for root, dirs, files in os.walk("/home/RawData", True): 
    for rep in dirs: 
     make_path(os.join("/home/RawData2/", rep) 
     # add processing here 
    del dirs[] # tell walk not to recurse in any sub directory 
+0

Ci proverò tra poco. Riferirò su come va. –

+0

Bene, questo è meglio in quanto ora produce "Sottocartella1", ma produce comunque tutte le cartelle anche sul livello Sottocartella2. –

+0

@ZR: avrei dovuto provarlo. Una lista è un oggetto mutevole, ma 'l = []' non cambia la lista originale ma si limita a fare riferimento a una lista vuota. Dovrebbe essere 'del l [:]'. Post modificato –

Problemi correlati