L'ho capito.
ho usato os.listdir per ottenere una lista di directory di primo livello, e quindi utilizzato la funzione .split sul sentiero che os.walk restituito, restituendo il primo elenco di livello che era attualmente in.
che ha lasciato io con una lista di directory toplevel, che ho trovato l'indice della directory corrente di os.walk e confrontare l'indice restituito con la lunghezza della lista, dandomi una percentuale completa. ;)
Questo non mi dà un liscio progresso, perché il livello di lavoro svolto in ciascuna directory può variare ma l'appianamento dell'indicatore di avanzamento non mi interessa. Ma potrebbe essere facilmente realizzato estendendo il controllo del percorso più in profondità nella struttura delle directory.
Ecco il codice finale di ottenere i miei progressi:
def locateGameDirs(filelist, root=os.curdir): #Find a list of files, return directories.
toplevel = [folder for folder in os.listdir(root) if os.path.isdir(os.path.join(root, folder))] #List of top-level directories
fileset = set(filelist)
for path, dirs, files in os.walk(os.path.abspath(root)):
curdir = path.split('\\')[1] #The directory os.walk is currently in.
try: #Thrown here because there's a nonexistant(?) first entry.
youarehere = toplevel.index(curdir)
progress = int(((youarehere)/len(toplevel))*100)
except:
pass
for filename in returnMatches(filelist, [k.lower() for k in files]):
yield filename, path + "\\", progress
E proprio ora per scopi che sto facendo questa ulteriore nel codice di debug:
for wow in locateGameDirs(["wow.exe", "firefox.exe", "vlc.exe"], "C:\\"):
print wow
Esiste un modo poco piacevole sbarazzarsi di quel tentativo/eccetto ?; sembra che la prima iterazione del percorso non mi dia nulla ...
la vera domanda è perché il tuo 'os.walk' impiega così tanto tempo? quanti file stai confondendo? qual è il rendimento dei 'returnMatches'? – SilentGhost
def returnMatches (a, b): elenco di ritorno (set (a) e set (b)) # Ripristina un elenco di corrispondenze tra elenchi dati. Questo è tutto returnMatches è ... questo richiede solo un paio di secondi per completare, ma sto aggiungendo il polacco al programma, così alle persone non sembra che il mio programma stia semplicemente facendo niente per un paio di secondi. Sulla macchina * MY * l'intera operazione richiede circa 10 secondi. Ma questo sarà impacchettato e funzionante su qualsiasi numero di macchine/ambienti Windows – ThantiK
Nota sulla mia macchina: Ancora in esecuzione un'unità IDE molto lenta. ;) – ThantiK