Problem with 'glob' in Python

0

Hello, I have a problem with glob , and it is that you are not giving me the files in an orderly way, it is a simple code:

import glob

filenames = glob.glob("C:\Users\LuisMiguel\Downloads\Faces\/*.jpg")
filenames.sort()

What gives me the way out is:

['C:\Users\LuisMiguel\Downloads\Faces\face1.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face10.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face11.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face12.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face13.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face14.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face15.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face16.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face17.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face18.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face19.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face2.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face20.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face3.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face4.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face5.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face6.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face7.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face8.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face9.jpg']

The output I would like to have is:

['C:\Users\LuisMiguel\Downloads\Faces\face1.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face2.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face3.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face4.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face5.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face6.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face7.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face8.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face9.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face10.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face11.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face12.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face13.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face14.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face15.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face16.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face17.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face18.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face19.jpg',
 'C:\Users\LuisMiguel\Downloads\Faces\face20.jpg']

I do not know why you are not ordering me, thank you in advance.

    
asked by Luis Miguel 29.11.2017 в 01:40
source

1 answer

1

Python when you order string is using Natural sort , so generate that order, you can give a comparison criterion sorted: we use the sorted function:

import glob
import os
import re

def fun(elem):
    head, tail = os.path.split(elem)
    number = int(re.findall(r'\d+', tail)[0])
    return number

filenames = glob.glob("C:\Users\LuisMiguel\Downloads\Faces\/*.jpg")
filenames = sorted(filenames, key=fun)
print(filenames)

the function fun () is passed as a key parameter, this is the value that is used to compare, so the task of fun () is to obtain the digit that accompanies .jpg, for this we use split () that separates and gives us the name of the folder and the name of the file, we use the latter, but since we want to extract the number one option would be to use regular expressions.

Another option to get the number is simply to delete "face" and ".jpg":

def fun(elem):
    head, tail = os.path.split(elem)
    number = int(tail[4:-4])
    return number
    
answered by 29.11.2017 / 01:56
source