2017-04-20 66 views
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 
+1

为什么你不能在一个镜头中得到整个列表,然后检查每个扩展名?这样做你只会得到一个完整的列表,你可以在那里工作。希望这有助于完成您的想法。 –

回答

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

谢谢!虽然你的扩展只是一个字符,但是如果我的是2或3,那么它是否重要? – uniXVanXcel

+0

'my_custom_keymap = {键:为值值,在枚举密钥(ext_list)}''键=拉姆达F:my_custom_keymap [os.path.splitext(F)[1]]' – Harvey

+1

@Pythus - 不,延伸部可以是任何长度,你现在可能已经想清楚了。 – Brian

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上寻找它!

+0

看看Brian的排序命令! –

+0

谢谢!真正有用的 – uniXVanXcel

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,因为我没有做它一个文件中我的本地测试目录。它将工作,不管。

+1

对于奥术魔法+1 – bernie

+2

@bernie这是什么魔法? –

+0

'files.append(files)'?你的意思是'files.append(文件)'?这就像你将自己的列表附加到自己?另外,我得到一个错误,说明我定义了一个扩展不存在 – uniXVanXcel

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 
相关问题