我有一个包含jpgs和其他文件的目录,jpgs都有包含数字的文件名.有些文件名可能包含其他字符串.
例如.
01.jpg
Run Code Online (Sandbox Code Playgroud)
或者可能是
Picture 03.jpg
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
我得到的就是这个
['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']
Run Code Online (Sandbox Code Playgroud)
很明显,它首先盲目地排序最重要的数字.我尝试使用,sorted()因为你可以看到希望它能解决它,但它没有任何区别.
Ste*_*ann 32
假设每个文件名中只有一个数字:
>>> 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']
Run Code Online (Sandbox Code Playgroud)
Let*_*lle 14
有一个模块natsort.做吧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']
Run Code Online (Sandbox Code Playgroud)
我有一个包含jpgs和其他文件的目录。
[...]
['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(),正如您所见,希望它可以解决此问题,但没有区别
您可以使用splitext获取不带扩展名的零件,并将其转换为int进行排序。如果列表名为“ l”,而排序后的列表名为“ lsorted”,则可以使用:
lsorted = sorted(l,key=lambda x: int(os.path.splitext(x)[0]))
Run Code Online (Sandbox Code Playgroud)
os.path.splitext在'10 .jpg'上返回['10','。jpg'],因此只要元素0不带扩展名的文件名仅包含可以使用int()转换为整数。否则,您将遇到错误。
| 归档时间: |
|
| 查看次数: |
47190 次 |
| 最近记录: |