3

我试图在给定扩展名的目录中对文件进行排序,但提供了我首先给出的顺序。假设我希望延期订单是

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

我能想到的唯一方法是在每次遇到特定扩展名时遍历每个文件并将它们放在一个列表中。

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 

然后最后

        for file in sorted_extension_list :
            print file
4

4 回答 4

5

这是另一种方法:

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']

编辑:我的输出没有,dd因为我没有在本地测试目录中为它创建文件。无论如何它都会起作用。

于 2017-04-20T15:34:56.733 回答
3

您可以使用sorted()自定义键:

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))

以上使用 mycompare 函数作为自定义键比较。在这种情况下,它会提取扩展名,并在my_custom_keymap字典中查找扩展名。

一种非常相似的方式(但更接近您的示例)可以使用列表作为地图:

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))
于 2017-04-20T15:25:04.217 回答
2
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 是您要查找的内容。否则,您可以使用带有 key 属性的命令 sorted()。只是在SO上寻找它!

于 2017-04-20T15:28:10.990 回答
1

使用sorted自定义键可能是最好的,但这是另一种方法,您可以根据扩展名将文件名存储在列表中。然后根据您的自定义订单将这些列表放在一起。

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
于 2017-04-20T15:47:15.480 回答