How can I sort a given specific order that I provide

I am trying to sort files in a directory based on their extension, but on the condition that I give the first order. Let's say I want the order of the expansion to be

ext_list = [ .bb, .cc , .dd , aa ]

      

The only way I can think of is to go through each file and list them every time a certain extension is encountered.

for subdir, dirs, files in os.walk(directory): 
     if file.endswith( '.bb') --> append file
     then go to the end of the directory
     then loop again
     if file.endswith( '.cc')  -->append file
     and so on...
return sorted_extension_list 

      

and then finally

        for file in sorted_extension_list :
            print file

      

+3


source to share


4 answers


You can use sorted()

with a custom key:

import os

my_custom_keymap = {".aa":2, ".bb":3, ".cc":0, ".dd":1}
def mycompare(f):
    return my_custom_keymap[os.path.splitext(f)[1]]

files = ["alfred.bb", "butters.dd", "charlie.cc", "derkins.aa"]

print(sorted(files, key=mycompare))

      

The above mycompare function is used to compare custom keys. In this case, it extracts the extension and looks up the extension in the dictionary my_custom_keymap

.



A very similar way (but closer to your example) could use a list as a map:

import os

my_custom_keymap = [".cc", ".dd", ".aa", ".bb"]
def mycompare(f):
    return my_custom_keymap.index(os.path.splitext(f)[1])

files = ["alfred.bb", "butters.dd", "charlie.cc", "derkins.aa"]

print(sorted(files, key=mycompare))

      

+3


source


Here's another way to do it:

files = []

for _, _, f in os.walk('directory'):
    files.append(f)

sorted(files,key=lambda x: ext_list.index(*[os.path.basename(x).split('.',1)[-1]]))

['buzz.bb', 'foo.cc', 'fizz.aa']

      



Edit: my output doesn't have dd

, since I didn't create a file for it in my local test directory. It will work independently.

+5


source


import os
# List you should get once:
file_list_name =['mickey.aa','mickey.dd','mickey_B.cc','mickey.bb']
ext_list = [ '.bb', '.cc' , '.dd' , '.aa' ]

order_list =[]
for ext in ext_list:
    for file in file_list_name:
        extension = os.path.splitext(file)[1]
        if extension == ext:
            order_list.append(file)

      

order_list is what you are looking for. Otherwise, you can use the sorted () command with a key attribute. Just find it on SO!

+2


source


Using sorted

with a custom key is probably best, but here's another way to store filenames in lists based on their extension. Then make these lists according to your individual order.

def get_sorted_list_of_files(dirname, extensions):
    extension_map = collections.defaultdict(list)
    for _, _, files in os.walk(dirname):
        for filename in files:
            extension = os.path.splitext(filename)[1]
            extension_map[extension].append(filename)
    pprint.pprint(extension_map)
    sorted_list = []
    for extension in extensions:
        sorted_list.extend(extension_map[extension])
    pprint.pprint(extensions)
    pprint.pprint(sorted_list)
    return sorted_list

      

+1


source







All Articles