2012-10-29 10 views
8

Wypełniam listbox sortera plikami z katalogu. Nazwy wszystkich plików zaczynają się od numeru od 01 - n. Kiedy przeglądam pliki w katalogu, pojawiają się one w kolejności numerycznej. Jednak po załadowaniu plików do listy nie są one porządkowane numerycznie. Mogę zmienić liczby wiodące, ale te same pliki zawsze będą pojawiać się w tym samym miejscu.Pliki z katalogu pobieranego w niewłaściwej kolejności za pomocą pythona

Używam tylko uproszczonych nazw przedmiotów, aby zachować prostotę w tym przykładzie. Wciąż pokazuje, że nie są sortowane alfabetycznie ani numerycznie.

Lista powinna pojawić się jako następujące w moim listbox

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

Ale to pojawia się jako:

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

mogę zmienić czołowych numerów dookoła, ale pliki będą zawsze wypełnić w taki sam zamówienie (według nazwy, a nie numeru). Dziwne jest to, że nie jest to nawet porządek alfabetyczny.

Użyłem tej

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

i to

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

Zarówno wynik w tej samej rzeczy.

+0

Dokumenty mówią ["Lista jest w dowolnej kolejności."] (Http://docs.python.org/2/library/os.html#os.listdir)! Być może jest to data modyfikacji? zagłębiłeś się w inne możliwości? –

+1

możesz spróbować 'na nazwę pliku w posortowanej (os.listdir (katalog)):' http://docs.python.org/2/library/functions.html#sorted – FabienAndre

+0

@FabienAndre działało idealnie, dzięki – user1104854

Odpowiedz

17

os.listdir nie gwarantuje żadnego uporządkowania zawartości katalogu. Jeśli chcesz sortować produkty, posortuj je za pomocą wbudowanej funkcji sorted (z odpowiednią funkcją key).

+1

W rzeczywistości dokumenty back you up: ["Lista jest w dowolnej kolejności."] (http://docs.python.org/2/library/os.html#os.listdir) (!) –

+0

@hayden - Tak. Prawdopodobnie istnieje * jakaś * metoda szaleństwa, ale prawdopodobnie jest to zależne od systemu plików, więc łatwiej jest dociec tylko "arbitralny". Dzięki za zamieszczenie linku :) – mgilson

+0

Dzięki, działało idealnie. Czy jest jakikolwiek powód, dla którego chciałbyś go w dowolnej kolejności? Mogę myśleć tylko o większej liczbie przypadków, kiedy chcesz, żeby było posortowane, niż nie. – user1104854

9

Spróbuj tego.

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

Jeśli numer jest częścią nazwy pliku, należy go opatrzyć komentarzem @ FabienAndre.

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

Byłby to "str (index + 1) .zfill (2) +". "+ nazwa pliku" - Ale (z wyglądu, 01. jest częścią nazwy pliku ...) – mgilson

+0

@mgilson, Naprawiono formatowanie, ale nie sądzę, że jest częścią nazwy pliku, ponieważ ma on i zmienna w pierwszym fragmencie kodu. – John

+0

Podczas używania '.format' możesz równie dobrze umieścić tam' ''' i 'nazwapliku'. ''{0: 02d}. {1} format. (Indeks + 1, nazwa pliku) ' – mgilson

Powiązane problemy