2013-04-22 17 views
6

Qualcuno sa come Python organizza i file durante il loro ciclo? Ho bisogno di eseguire il ciclo su alcuni file in una cartella in un ordine fisso (preferibilmente alfanumerico secondo i nomi dei file), ma Python sembra ricorrere ad essi in un ordine piuttosto casuale. Finora io sto usando questo codice:Python - looping su file - ordine

filelist = glob.glob(os.path.join(path, 'FV/*.txt')) 
for infile in filelist: 
    #do some fancy stuff 
    print str(infile) 

e i nomi dei file sono stampati in un ordine non proprio ovvio per me.

C'è un modo semplice per predefinire un determinato ordine per quel ciclo? Grazie!

+2

solo per motivi di completezza: se si desidera solo scorrere i file, os.listdir è spesso sufficiente (... non nel tuo caso, perché vuoi espandere * .txt). – born

risposta

11

Per quanto posso vedere nei documenti, glob.glob() non ha un ordine definito. Detto questo, il modo più semplice per essere sicuri è quello di ordinare l'elenco rispedito al mittente:

filelist = glob.glob(os.path.join(path, 'FV/*.txt')) 
for infile in sorted(filelist): 
    #do some fancy stuff 
    print str(infile) 

Questo sarà solo tipo come stringhe - che dà il semplice ordine fisso che stavi cercando. Se hai bisogno di un ordine specifico, allora prende key come argomento di parole chiave, che è una funzione che dà ordine. Vedi la documentazione (collegata in precedenza) per ulteriori informazioni.

+0

Mi picchia. Alfanumerico è l'ordinamento predefinito per le stringhe, corretto?+1 – BlackVegetable

+0

@BlackVegetable Sì, sarà solo un tipo semplice - ovviamente, potresti definire una funzione 'chiave' per ordinare come vuoi. –

+0

Forse potresti modificare la tua risposta per includere quell'informazione così come una nota su 'reverse'? – BlackVegetable

-3
import os 
for root, dirs, files in os.walk(os.path.join(path, 'FV/'), topdown=True): 
    print root 
    print files.sort(reverse=True) 

E 'un'alternativa .. (considerando che glob.glob() prende alcun parametro per richiedere i materiali, ho appena presentato in alternativa al glob.glob() che è, walk() .. Ci vuole parametri che potrebbero essere utili e penso che le downvotes sono ingiusti ma hey ognuno ha diritto alla loro opinione -.-)

+0

-1, Questo non è equivalente. 'walk()' fornisce tutti i file e va nelle sottodirectory. –

+0

interrompi se non ti piace entrare nelle sottodirectory. 'walk()' ti dà il controllo, non fa cose che tu non esplicitamente non vuoi che faccia. – Torxed

+2

È piuttosto sciocco usare 'walk' quando non si desidera ricorrere in sottodirectory. E non vi è alcuna garanzia che 'walk' fornisca i file in ordine alfabetico come richiesto. – interjay