I have a folder of files and want to read the files one by one because it is frames of a video.
However, when I am trying to have an ordered list of files, it is ordered as follows:
data_dir = './data/'
filenames =listdir(data_dir)
N=len(filenames)
filenames.sort()
filenames
['Image1.jpg',
'Image10.jpg',
'Image11.jpg',
'Image12.jpg',
'Image13.jpg',
'Image14.jpg',
'Image15.jpg',
'Image2.jpg',
'Image3.jpg',
'Image4.jpg',
'Image5.jpg',
'Image6.jpg',
'Image7.jpg',
'Image8.jpg',
'Image9.jpg']
How to have an ordered list of images based on the numbers?
CodePudding user response:
Use the sorted
function with a lambda
by key
(this assumes all filenames contain "IMG"):
sorted_filenames = sorted(filenames, key= lambda x: int(x.split("IMG")[1].split(".")[0]))
Result:
['IMG1.bmp',
'IMG2.bmp',
'IMG3.bmp',
'IMG4.bmp',
'IMG5.bmp',
'IMG6.bmp',
'IMG7.bmp',
'IMG8.bmp',
'IMG9.bmp',
'IMG10.bmp',
'IMG11.bmp',
'IMG12.bmp',
'IMG13.bmp',
'IMG14.bmp',
'IMG15.bmp']
CodePudding user response:
Use regex to extract the numeric part and use custom sorting to sort accordingly you can also use regex like r"Image(\d ).jpg"
to be precise.
import re
data_dir = './data/'
filenames =listdir(data_dir)
N=len(filenames)
filenames.sort(key=lambda filename : int(''.join(re.findall("\d ",filename))))
filenames