2014-03-04 48 views
1

我的python函數被賦予了一個(長)的路徑參數列表,每個列表都可能是一個glob。我做了一通過使用glob.glob這個列表中提取所有匹配的文件名,如:從Python中的fnmatch模式中分離普通文件名

files = [filename for pattern in patterns for filename in glob.glob(pattern)] 

這一工程,但我在文件系統中有目錄的表現非常差掛牌運營,目前該操作會增加大約一分鐘(!)到我的程序啓動時間。所以我只想對非平凡的glob模式(即那些不是普通路徑名的模式)進行glob擴展來加速。即

def cheapglob(pattern): 
    return [pattern] if istrivial(pattern) else glob.glob(pattern) 
files = [filename for pattern in patterns for filename in cheapglob(pattern)] 

由於glob.glob基本上沒有一套加上fnmatch.fnmatch目錄列表,我想這應該是可能以某種方式向fnmatch給定的字符串是否是一個不平凡的圖案或沒有,但我看不出要做到這一點。

作爲一個後備,我想我可以嘗試在字符串中自己識別這些模式,儘管這很像重新發明輪子,並且容易出錯。但是,這感覺就像那種事情應該有一個優雅的解決方案。

回答

1

the fnmatch source code,它承認只有特殊字符*?[]。因此,不包含任何這些模式的任何模式只會匹配它自己。因此,我們可以實現在問題中提到的cheapglob作爲

def cheapglob(s): return glob.glob(s) if re.search("[][*?]", s) else [s] 

這隻會打文件系統的模式,其中包括特殊字符。這與普通的glob.glob略有不同:對於沒有特殊字符(如「foo.txt」)的模式,無論該文件是否存在,該函數都將返回["foo.txt"],而如果該文件不存在,則glob.glob將返回[]。所以調用函數需要處理一些返回的文件可能不存在的可能性。

-1

我不認爲你會發現很多,因爲你對一個微不足道的模式的想法可能不是我的。此外,從comp-sci的角度來看,可能無法通過檢查來判斷下推自動機是否會在給定的運行時間內運行一定的時間,而不會實際運行它以抵禦這些輸入。

我強烈懷疑你最好在這裏加載目錄列表一次,然後手動對該列表應用fnmatch

+0

如何「一個沒有字符的模式,fnmatch認爲是特殊的」,然後呢?那些只會匹配自己。這是一個明確的問題。 我沒有隻有一個目錄,我可以一勞永逸地列出。這不會是一個問題。在我提到的問題的1分鐘運行時間內,每個目錄已經每次只列出一次。只有很多,每個列表都很慢。 – amaurea