Ordenar los nombres de archivo en el directorio en orden ascendente

Tengo un directorio con jpgs y otros archivos en él, todos los jpgs tienen nombres de archivo con números en ellos. Algunos pueden tener cadenas adicionales en el nombre de archivo.

Por ejemplo.

01.jpg 

O podría ser

 Picture 03.jpg 

En Python necesito una lista de todos los jpgs en orden ascendente. Aquí está el fragmento de código para esto

 import os import numpy as np myimages = [] #list of image filenames dirFiles = os.listdir('.') #list of directory files dirFiles.sort() #good initial sort but doesnt sort numerically very well sorted(dirFiles) #sort numerically in ascending order for files in dirFiles: #filter out all non jpgs if '.jpg' in files: myimages.append(files) print len(myimages) print myimages 

Lo que obtengo es esto

 ['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg', '21.jpg', '22.jpg', '23.jpg', '24.jpg', '25.jpg', '26.jpg', '27.jpg', '28.jpg', '29.jpg', '3.jpg', '30.jpg', '31.jpg', '32.jpg', '33.jpg', '34.jpg', '35.jpg', '36.jpg', '37.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg'] 

Claramente, clasifica ciegamente el número más significativo primero. Intenté usar sorted() como puede ver con la esperanza de que lo arregle, pero no hace ninguna diferencia.

Suponiendo que solo hay un número en cada nombre de archivo:

 >>> dirFiles = ['Picture 03.jpg', '02.jpg', '1.jpg'] >>> dirFiles.sort(key=lambda f: int(filter(str.isdigit, f))) >>> dirFiles ['1.jpg', '02.jpg', 'Picture 03.jpg'] 

Hay un módulo natsort . Sólo tienes que pip install natsort .

 >>> import natsort >>> ll = ['Picture 13.jpg', 'Picture 14.jpg', 'Picture 15.jpg','Picture 0.jpg', 'Picture 1.jpg', 'Picture 10.jpg', 'Picture 11.jpg', 'Picture 12.jpg', 'Picture 16.jpg', 'Picture 17.jpg', 'Picture 18.jpg', 'Picture 19.jpg', 'Picture 2.jpg', 'Picture 20.jpg', 'Picture 21.jpg', 'Picture 22.jpg', 'Picture 23.jpg', 'Picture 24.jpg', 'Picture 25.jpg', 'Picture 26.jpg', 'Picture 27.jpg', 'Picture 28.jpg', 'Picture 29.jpg', 'Picture 3.jpg', 'Picture 30.jpg', 'Picture 31.jpg', 'Picture 32.jpg', 'Picture 33.jpg', 'Picture 34.jpg', 'Picture 35.jpg', 'Picture 36.jpg', 'Picture 37.jpg'] >>> print(natsort.natsorted(ll,reverse=True)) ['Picture 37.jpg', 'Picture 36.jpg', 'Picture 35.jpg', 'Picture 34.jpg', 'Picture 33.jpg', 'Picture 32.jpg', 'Picture 31.jpg', 'Picture 30.jpg', 'Picture 29.jpg', 'Picture 28.jpg', 'Picture 27.jpg', 'Picture 26.jpg', 'Picture 25.jpg', 'Picture 24.jpg', 'Picture 23.jpg', 'Picture 22.jpg', 'Picture 21.jpg', 'Picture 20.jpg', 'Picture 19.jpg', 'Picture 18.jpg', 'Picture 17.jpg', 'Picture 16.jpg', 'Picture 15.jpg', 'Picture 14.jpg', 'Picture 13.jpg', 'Picture 12.jpg', 'Picture 11.jpg', 'Picture 10.jpg', 'Picture 3.jpg', 'Picture 2.jpg', 'Picture 1.jpg', 'Picture 0.jpg'] 

Tengo un directorio con jpgs y otros archivos en él.

[…]

[‘0.jpg’, ‘1.jpg’, ’10 .jpg ‘, ’11 .jpg’, ’12 .jpg ‘, ’13 .jpg’, ’14 .jpg ‘, ’15 .jpg’, ‘ 16.jpg ‘, ’17 .jpg’, ’18 .jpg ‘, ’19 .jpg’, ‘2.jpg’, ’20 .jpg ‘, ’21 .jpg’, ’22 .jpg ‘, ’23. jpg ‘, ’24 .jpg’, ’25 .jpg ‘, ’26 .jpg’, ’27 .jpg ‘, ’28 .jpg’, ’29 .jpg ‘,’ 3.jpg ‘, ’30 .jpg’ , ’31 .jpg ‘, ’32 .jpg’, ’33 .jpg ‘, ’34 .jpg’, ’35 .jpg ‘, ’36 .jpg’, ’37 .jpg ‘,’ 4.jpg ‘,’ 5.jpg ‘,’ 6.jpg ‘,’ 7.jpg ‘,’ 8.jpg ‘,’ 9.jpg ‘] Claramente, clasifica ciegamente el número más significativo primero. Intenté usar ordenado () como puede ver con la esperanza de que lo arregle, pero no hace ninguna diferencia.

Puede usar splitext para obtener la parte sin la extensión y convertirla en un int para la clasificación. Si la lista se llama ‘l’ y la lista ordenada se llama ‘lsorted’ puede usar:

 lsorted = sorted(l,key=lambda x: int(os.path.splitext(x)[0])) 

os.path.splitext en ’10 .jpg ‘devuelve [‘ 10 ‘,’. jpg ‘], por lo que tomar el int () del elemento cero le dará el deseo que desee mientras los nombres de archivo sin la extensión solo contengan cadenas que puedan convertirse en enteros con int (). De lo contrario, se encontrará con un error.