且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

按升序对目录中的文件名进行排序

更新时间:2023-02-23 19:57:21

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

>>>dirFiles = ['图片 03.jpg', '02.jpg', '1.jpg']>>>dirFiles.sort(key=lambda f: int(filter(str.isdigit, f)))>>>目录文件['1.jpg', '02.jpg', '图片03.jpg']

同样适用于 Python 3 的版本:

>>>dirFiles.sort(key=lambda f: int(re.sub('D', '', f)))

I have a directory with jpgs and other files in it, the jpgs all have filenames with numbers in them. Some may have additional strings in the filename.

For example.

01.jpg

Or it could be

Picture 03.jpg

In Python I need a list of all the jpgs in ascending order. Here is the code snippet for this

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

What I get is this

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

Clearly it sorts blindly the most significant number first. I tried using sorted() as you can see hoping that it would fix it but it makes no difference.

Assuming there's just one number in each file name:

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

A version that also works in Python 3:

>>> dirFiles.sort(key=lambda f: int(re.sub('D', '', f)))