2013-02-03 48 views
1

所以我有一個腳本,我通過一個文件夾中的一組文件循環。在檢索該特定目錄中的文件列表後,如何指定我想在腳本中使用哪些文件?循環遍歷python中的特定文件

target = './directory/' 

for file in listdir(target): 

現在我在同一個文件夾中有幾個不同的文件。

  • kplr006933899 -2009131105131_ LLC .fits
  • kplr006933899-2009131105131_ LPD-TARG .fits
  • kplr006933899-2012151031540_ SLC .fits
  • kplr006933899-2012151031540_ SPD-TARG。套件

它們全部是同一組的一部分,表示爲「kplr006933899」。 如何指定字符串的部分作爲不同的變量,以指定我想循環通過哪些文件?

例如像:

def function(name,types) 

在那裏你可以寫調用時:

function(kplr006933899,[slc,llc]) 
+1

您能更好的解釋?我的意思是,你想把所有以'kplr' +某個數字開頭幷包含特定其他子串的文件組合在一起,或者你只是想過濾以'kplr'開頭幷包含一些子串的名稱? – Bakuriu

回答

3

有多種方法可以做到這一點。第一種方法:

import fnmatch 

def my_function(name, types): 
    result = [] 
    for t in types: 
     pattern = "{}*{}.fits".format(name, t) 
     for filename in fnmatch.filter(listdir(target), pattern): 
      result.append(filename) 
    return result 

您可以使用以下函數調用此函數:my_function("kplr006933899", ["slc", "llc"])fnmatch.filter函數執行與您的模式和給定的文件名匹配的模式。

第二種方法是使用glob

result = [] 
for t in types: 
    result.extend(glob.glob("{}/{}*{}.fits".format(target, name, t))) 
return result 
+0

爲什麼不使用['glob'](http://docs.python.org/2/library/glob.html)模塊? – Bakuriu

+0

@Bakuriu:謝謝,有道理。我也加了'glob'解決方案。 –

+0

謝謝你simeon!太棒了! –

0
>>> "kplr" in "kplr006933899-2009131105131_llc.fits" 
True 
>>> 
>>> "kplR" in "kplr006933899-2009131105131_llc.fits" 
False 
>>> 

注意,你需要把引號表示字符串function("kplr006933899", [slc, llc]),否則kplr006933899將被解釋作爲一個變量。

+0

哦,是的,那只是一個錯字。我只是看着fnmatch函數,我得到了這麼多:如果fnmatch.fnmatch(文件,'kplr006933899 * slc.fits'):' 'os.listdir('./')中文件的 ': 現在我希望能夠指定字符串的開頭,並且可能是字符串的可能結束的列表,例如slc,llc,因此它只會在文件名末尾以slc或llc循環文件。 –