按升序排序目录中的文件名

时间:2015-10-15 21:50:20

标签: python sorting

我有一个包含jpgs和其他文件的目录,jpgs都有包含数字的文件名。有些文件可能有其他字符串。

例如。

01.jpg

或者可能是

Picture 03.jpg

在Python中,我需要按升序排列所有jpgs。 以下是此

的代码段
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

我得到的是这个

['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']

显然,它首先盲目地排序最重要的数字。我尝试使用sorted(),因为你可以看到希望它可以修复它,但它没有任何区别。

3 个答案:

答案 0 :(得分:26)

假设每个文件名中只有一个数字:

>>> 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']

答案 1 :(得分:8)

有一个模块node_modules。只需natsort

pip install natsort

答案 2 :(得分:5)

  

我有一个包含jpgs和其他文件的目录。

[...]

  

[' 0.jpg',' 1.jpg',' 10.jpg',' 11.jpg',&# 39; 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']显然它最盲目地排序   有意义的数字。我尝试使用sorted(),因为你可以看到希望   它会修复它,但没有区别

您可以使用splitext获取没有扩展名的部分,并将其转换为int以进行排序。如果列表被命名为' l'并且已排序的列表被命名为“排序”和“排序”。你可以使用:

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

os.path.splitext on' 10.jpg'返回[' 10',' .jpg']因此,只要没有扩展名的文件名只包含可以使用的字符串,那么获取元素为零的int()将为您提供所需的内容用int()转换为整数。否则你会遇到错误。