2017-04-20 31 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 
相關問題