2013-04-22 18 views
6

Czy ktoś wie, w jaki sposób Python porządkuje pliki podczas ich przechwytywania? Muszę zapętlić niektóre pliki w folderze w ustalonej kolejności (najlepiej alfanumerycznie w zależności od nazw plików), ale Python zdaje się pętać nad nimi w raczej losowej kolejności. tej pory używam tego kodu:Python - zapętlaj pliki - zamów

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

i nazwy plików są drukowane w kolejności nie bardzo dla mnie oczywiste.

Czy istnieje prosty sposób wstępnego zdefiniowania określonej kolejności dla tej pętli? Dzięki!

+2

tylko ze względu na kompletność: jeśli chcesz tylko iterować przez pliki, często wystarcza os.listdir (... nie w twoim przypadku, ponieważ chcesz rozwinąć * .txt). – born

Odpowiedz

11

O ile widzę w dokumentach, glob.glob() nie ma zdefiniowanego porządku. Biorąc pod uwagę to, najprostszym sposobem, aby upewnić się, aby posortować listę zwrócone:

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

To po prostu rodzaj jako ciągi - co daje prosty rozkaz stałą, czego szukasz. Jeśli potrzebujesz konkretnego zamówienia, wówczas sorted() przyjmuje key jako argument słowa kluczowego, który jest funkcją dającą porządek sortowania. Zobacz dokumentację (linkowane wcześniej), aby uzyskać więcej informacji.

+0

Pokonaj mnie. Alfanumeryczne to domyślne sortowanie ciągów znaków, prawda?+1 – BlackVegetable

+0

@BlackVegetable Tak, to będzie po prostu prosty sort - oczywiście możesz zdefiniować funkcję 'klucz' do sortowania według własnego uznania. –

+0

Być może mógłbyś edytować swoją odpowiedź, dodając te informacje, a także notatkę o "odwrocie"? – 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) 

Jest alternatywą .. (biorąc pod uwagę, że nie bierze glob.glob() parametr zamawiania przedmiotów, po prostu przedstawił alternatywę glob.glob() który jest, walk() .. To trwa parametry, które mogą być przydatne i myślę, że downvotes są nieuczciwe, ale każdy ma prawo do ich opinii -.-)

+0

-1, To nie jest odpowiednik. 'walk()' daje wszystkie pliki i przechodzi do podkatalogów. –

+0

Przerwij, jeśli nie chcesz przejść do podkatalogów. 'walk()' daje ci kontrolę, nie robi rzeczy, których nie chcesz tego robić. – Torxed

+2

To dość głupie, aby użyć 'walk', gdy nie chcesz rekursować się w podkatalogach. I nie ma gwarancji, że "spacer" da ci pliki w porządku alfabetycznym, jak twierdzisz. – interjay