2014-05-18 15 views
7

Jak dodać pliki do listy, abyZamówione os.listdir() w Pythonie

W moim katalogu mam następujące pliki: slide1.xml, slide2.xml, slide3.xml ... slide13.xml

os.listdir(path) nie zwraca mi listę według kolejności

próbowałem ten sposób

files_list = [x for x in sorted(os.listdir(path+"/slides/")) if os.path.isfile(path+"/slides/"+x)] 

wyjściowa: ['slide1.xml', 'slide10.xml', 'slide11.xml', 'slide12.xml', 'slide13.xml', 'slide2.xml', 'slide3.xml', 'slide3_COPY.xml', 'slide4.xml', 'slide5.xml', 'slide6.xml', 'slide7.xml', 'slide8.xml', 'slide9.xml']

+0

myślę, że jest w kolejności, "slide10.x ml "idzie przed" slajd2.xml ". Jeśli chcesz, aby slajd "slajd2.xml" brzmiał wcześniej niż "slajd10.xml", musisz zaimplementować sortowanie niestandardowe – Andres

Odpowiedz

9

Sortuj wg klucza:

import re 
files = ['slide1.xml', 'slide10.xml', 'slide11.xml', 'slide12.xml', 'slide13.xml', 'slide2.xml', 'slide3.xml', 'slide3_COPY.xml', 'slide4.xml', 'slide5.xml', 'slide6.xml', 'slide7.xml', 'slide8.xml', 'slide9.xml'] 
ordered_files = sorted(files, key=lambda x: (int(re.sub('\D','',x)),x)) 

daje ['slide1.xml', 'slide2.xml', 'slide3.xml', 'slide3_COPY.xml', 'slide4.xml', 'slide5.xml', 'slide6.xml', 'slide7.xml', 'slide8.xml', 'slide9.xml', 'slide10.xml', 'slide11.xml', 'slide12.xml', 'slide13.xml']

+0

\ d może mieć problem, jeśli twoja nazwa pliku zawiera znak specjalny, na przykład cyfry arabskie wschodnie. Zobacz ten http://stackoverflow.com/a/6479605/2157469 – Hao

1

Możesz użyć własną funkcję sortowania

def custom_sort(x, y): 
    pass 
    #your custom sort 

files_list = [x for x in sorted(os.listdir(path+"/slides/"), cmp=custom_sort) if os.path.isfile(path+"/slides/"+x)] 

doc

również sprawdzić natsort