2015-09-08 102 views
2

基本上我希望文件名以擴展名列表的擴展名結尾。 這是我在python中的代碼。 我已經採取了一些樣品作爲文件名列表下面給出:Python:檢查文件名以擴展名列表中的擴展名結尾

extensions = ['.mp3','.m4a','.wma'] 
filenames = ['foo1.mp3','foo2.txt','foo3.m4a','foo4.mp4'] 
for filename in filenames: 
    for extension in extensions: 
     if filename.endswith(extension): 
      print filename 
      break 

這是工作,但我很好奇,想知道是否有在Python做同樣的事情更有效的或短的路。 謝謝

+2

'在文件名中的文件名:如果有任何(擴展名爲文件名的filename.endswith(ext)):print filename'? – jonrsharpe

+0

至於效率...很難說,因爲你的描述說你想要文件名(複數),但你的代碼只打印出第一個 - 這是實際需要的行爲。 – scytale

+0

@jonrsharpe的評論是你正在尋找的答案。 – taesu

回答

3

endswith接受一個元組,因此它很容易:

exts = tuple(extensions) 
[f for f in filenames if f.endswith(exts)] 
+1

不知道。涼! –

0

可以使用list comprehension一個簡潔的方式來做到這一點:

[f for f in filenames for e in extensions if f.endswith(e)] 
+0

這不是捷徑,所以效率會降低。 – jonrsharpe

+0

海報要求更有效或短 – scytale

+0

這是真的,但考慮到你可以很容易做到這兩個爲什麼解決一個(你至少可以*提及*此屬性)? – jonrsharpe

1
print [f for f in filenames if f[f.rindex('.'):] in extensions] 

它是如何工作:

這是一個列表理解,所以有趣的部分是在「if」之後。

那麼,我們使用f.rindex('。')來查找文件名中的最後一個點。然後我們使用切片從那裏獲取f的部分到最後。最後,「in extensions」只檢查擴展名列表是否包含文件的擴展名。