0

I'm using python 2.7 and I'm trying to read filenames in a folder, sorted in aphanumberical order.

My code is:

filenamelist=[]
txt_path = 'decoded'

for filename in sorted(os.listdir(txt_path)):
  with open(txt_path+"/"+filename) as myfile:
    for line in myfile:
        if "Total Time" in line:

            filenamelist.append(filename)

When I print filenamelist I get the following:

['pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_0_192x144_15_50_dec.txt', 'p irkagia_10b_lowdelay_P_192x144_Filters_OFF_level_10_192x144_25_42_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_11_192x144_25_38_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_12_192x144_25_34_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_13_192x144_25_30_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_14_192x144_25_26_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_15_192x144_25_22_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_1_192x144_15_46_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_2_192x144_15_42_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_3_192x144_15_38_dec.txt', 'pirkagia_10b_lowdelay_P_192x144_Filters_OFF_level_4_192x144_15_34_dec.txt', ...]

As can be seen, this is not sorted. I want to get level_0, level_1, level_2, ..., level_9, level_10...].

Can you help me please?

zinon
  • 4,427
  • 14
  • 70
  • 112

1 Answers1

0

Thanks to @bakaDev this is the solution to my problem:

import re #for natural sorting

filenamelist=[]
txt_path = 'decoded'

_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split(_nsre, s)]   

fnlist = os.listdir(txt_path)

fnlist.sort(key=natural_sort_key)

for filename in fnlist):
  with open(txt_path+"/"+filename) as myfile:
    for line in myfile:
        if "Total Time" in line:

            filenamelist.append(filename)
zinon
  • 4,427
  • 14
  • 70
  • 112