2012-10-29 8 views
8

Sto compilando una casella di riepilogo tkinter con file da una directory. I nomi dei file iniziano tutti con un numero compreso tra 01 e n. Quando visualizzo i file nella directory, vengono visualizzati in ordine numerico. Tuttavia, quando carico i file in una listbox non vengono ordinati numericamente. Posso cambiare i numeri principali, ma gli stessi file appariranno sempre nello stesso punto.I file dalla directory vengono estratti in ordine errato con python

Sto usando solo nomi di articoli semplificati per mantenere le cose semplici con questo esempio. Mostra ancora che non vengono ordinati alfabeticamente o numericamente.

La lista dovrebbe apparire come il seguente nella mia casella di riepilogo

01. itemA 
02. itemB 
03. itemC 
04. itemD 

Ma sembra come:

01. itemA 
04. itemD 
02. itemB 
03. itemC 

posso cambiare i numeri principali intorno, ma i file saranno sempre popolare nella stessa ordine (per nome, non numero). La cosa strana è che non è nemmeno in ordine alfabetico.

Ho usato questo

i = 0 
for filename in os.listdir(directory): 
     fileList.insert(i, filename) 
     i = i + 1 

E questo

for filename in os.listdir(directory): 
     fileList.insert(END, filename) 

Sia risultato nella stessa cosa.

+0

Il docs dice [ "L'elenco è in ordine arbitrario."] (Http://docs.python.org/2/library/os.html#os.listdir)! Forse è la data di modifica? hai approfondito altre possibilità? –

+1

si potrebbe provare 'per nome file in ordine (os.listdir (directory)):' http://docs.python.org/2/library/functions.html#sorted – FabienAndre

+0

@FabienAndre ha funzionato perfettamente, grazie – user1104854

risposta

17

os.listdir non garantisce l'ordinamento del contenuto di una directory. Se si desidera ordinare gli elementi, basta ordinarli utilizzando la funzione incorporata sorted (con una funzione appropriata key se necessario).

+1

In effetti i documenti back up: ["La lista è in ordine arbitrario."] (http://docs.python.org/2/library/os.html#os.listdir) (!) –

+0

@hayden - Sì. Probabilmente c'è un * qualche * metodo per la follia, ma è probabilmente dipendente dal filesystem e quindi è più facile per i doc dire semplicemente "arbitrario". Grazie per aver pubblicato un collegamento però :) – mgilson

+0

Grazie, ha funzionato perfettamente. C'è qualche motivo per cui lo vorresti in un ordine arbitrario? Posso solo pensare a più istanze quando vorresti ordinarlo diversamente. – user1104854

9

Prova questo.

for index, filename in enumerate(sorted(os.listdir(directory))): 
     print '{0:02d}. {1}'.format(index + 1, filename) 

Nel caso in cui il numero sia parte del nome file, andare con il commento di @ FabienAndre.

for filename in sorted(os.listdir(directory)): 
     print filename 
+1

Sarebbe 'str (index + 1) .zfill (2) + '. '+ filename' - Ma (dal punto di vista di esso, 01. è parte del nome del file ...) – mgilson

+0

@mgilson, Risolto il problema con la formattazione, tuttavia non penso che sia parte del nome del file variabile nel primo snippet di codice. – John

+0

Mentre si utilizza '.format', si potrebbe anche inserire' ''e' filename' anche lì. ' '{0: 02d}. {1} '. Format (index + 1, filename) ' – mgilson

Problemi correlati