2015-10-14 29 views
0

我正在尋找篩選目錄中的文件,然後將該部分filename(我試圖匹配更改的值)分配給一個變量。 filename的結構與以下示例一致。 *test file on part-of-filename-of-interest.csvfilename的最後一部分是我想要添加到變量值的部分。所以它將始終是文件名的最後一部分,並且在on之後。讀取一個文件名並將該名稱的一部分應用於變量

我能夠使用下面的過濾所有感興趣的文件,但我不確定如何抓取part-of-filename-of-interest部分以將其置於變量值。

for root, dirs, files in os.walk('dirpath'): 
    filters = '*test file on*.csv' 
    for filename in fnmatch.filter(files, filters): 
     print filename #I get all the files im interested in but I dont know how to capture the relevant part of the filename to place it in a variable 
+0

你確定你需要嵌套循環? [文檔中的示例](https://docs.python.org/2/library/fnmatch.html)不會這樣做。 – TigerhawkT3

+0

那是因爲該示例沒有多個dirs可以通過;)。無論嵌套循環如何,問題都是將一個部分文件名捕獲到一個變量中。不是如何循環文件。 – iNoob

+0

我能夠組成一個基於digitaLink的答案的工作過濾器。 – iNoob

回答

1

嘗試使用正則表達式匹配你想要的部分。

import re 
p = re.compile("(?<=on).+") 
filename = "*test file on part-of-filename-of-interest.csv" 
new_filename = p.search(filename).group(0) 

如果您不希望該.csv包括改變正則表達式是:

p = re.compile("(?<=on).+(?=.csv)") 

這是前瞻和回顧後的一個很好的例子。

+0

幾乎可以工作,但它也會打印'on'字樣。 – iNoob

+0

This works great'p.search(filename).group(0).replace('on','')' – iNoob

+0

爲了完整起見,您可以添加上面的評論代碼到您的答案和不好接受 – iNoob

1

根據您的模式的一致性,這會適合您嗎?

>>> fn = 'test file on part-of-filename-of-interest.csv' 
>>> import os 
>>> os.path.splitext(fn[fn.find('test file on') + 13:])[0] 
'part-of-filename-of-interest' 
+0

不幸的是,感興趣的部分的長度確實有所不同 – iNoob

+0

感謝您對BlivetWidget的迴應。 – iNoob

+1

@iNoob那是不幸的?上述功能並不在乎感興趣的部分有多長。 – BlivetWidget

1

如果沒有辦法訪問你正在尋找與fnmatch什麼,最簡單和最快的解決方案可能是一個字符串的方法:

print filename.partition('on')[2] 
相關問題