2017-06-29 81 views
0

我一直無法找到這個用例,但基本上我試圖利用glob來獲取文件名的一部分。在Glob中使用部分通配符

file_name_date = time.strftime("%m%d%y") 
h_server = time.strftime("%-I%p")  
filename = 'PRD.FRB.D01.INTRADAY.GGV1051.' + file_name_date + '.' + h_server + '.txt' 

這工作在我的代碼正常,但是現在GGV1051與每個文件的改變,所以我希望做這樣的事情

filename = glob('PRD.FRB.D01.INTRADAY.' + * + '.' + file_name_date + '.' + h_server + '.txt' 

但我不知道如何着手。我沒有看到fnmatchglob的清晰路徑,但我並不熟悉這些庫。

我的想法是創建一個像這樣的字符串:

filename = str('PRD.FRB.D01.INTRADAY.?.' + file_name_date + '.' + h_server + '.txt') 

這將產生:

PRD.FRB.D01.INTRADAY.?.062917.12P.txt 

,然後像做

glob(filename): 

但不工作如預期。

有什麼想法?謝謝!

+0

使用'os.listfiles'獲取目錄中的所有文件,並使用for循環來檢查*** PRD.FRB.D01.INTRADAY。***是否在文件名中。 – Stack

+0

這將最終需要一段時間,因爲文件夾已滿,所有文件名都將具有PRD.FRB.D01.INTRADAY,這是放入文件夾中的唯一東西。我的希望是爲GGVXXX部分使用通配符,因爲每一天都有獨特的日期和時間,所以如果我正在搜索PRD.FRB.D01.INTRADAY。*。062917.11A.txt,它只會一直運行在PRD.FRB.D01.INTRADAY。*。063017.11A.txt – Benloper

回答

1

使用glob匹配諸如/home/juser/something/*.txt路徑名的所有文本文件中/home/juser directory。您可以使用它來匹配當前工作目錄中所有文本文件等簡單文件名,如*.txt

fnmatch.fnmatchfnmatch.filter用於filenmaes。前者測試文件名是否匹配模式,並返回True表示匹配的名稱,否則返回False表示不匹配的名稱。後者根據給定的glob模式返回匹配的文件名。

所有的文件名都以PRD.FRB.D01.INTRADAY開頭。並以.txt後綴結尾,然後匹配以PRD.FRB.D01.INTRADAY開頭的所有文件。並結束與.TXT不論什麼在中間:

glob.glob("PRD.FRB.D01.INTRADAY.*.txt") 

這水珠與PRD.FRB.D01.INTRADAY開頭的文件名匹配。並以.txt後綴結尾,這與PRD.FRB.D01.INTRADAY之後的內容無關。 *通配符匹配任何任意字符。 ?只匹配一個任意字符。注意,這會匹配腳本的工作目錄中的文件名。如果您需要匹配不同目錄中的名稱,請將"/path/to/my/PRD.FRB.D01.INTRADAY.*.txt"更改爲glob

+0

謝謝,但我試圖減少時間,因爲這個搜索很快就會變得昂貴,因爲我知道日期和時間的組合,我將永遠是獨一無二的,在那裏一種方法來封裝。我看到你對Intraday和txt之間的內容有什麼看法,但是它會返回數以千計的文件。如果我可以簡單地通過今天的日期和時間函數,那將只返回一個文件,GVXXXX是無關緊要的,它是從我們的大型機推送的,我想要做的就是將它排除在尋找文件之外。 – Benloper

+0

@Benloper我希望我這次能夠幫到你。在你的問題中,你試圖匹配''PRD.FRB.D01.INTRADAY。'。' + file_name_date +'。' + h_server'因爲你使用'?'而不是'*',因爲日期和時間是唯一的,所以''PRD.FRB.D01.INTRADAY。*。' + file_name_date +'。' + h_server'應該完成這項工作。這裏有一個技巧,將未知部分改爲'*',然後寫出你知道的其餘文件名(文件名的已知部分)。這有幫助嗎? – direprobs

+0

是的,我想我現在擁有它。我基本上做了你所說的,但是我確實把它放在了字符串中,然後把字符串傳遞給glob,這很有效。 filename = str('PRD.FRB.D01.INTRADAY。*。'+ file_name_date +'。'+ h_server +'.txt') filenames = glob.glob(filename) – Benloper

1

這應該工作,星號符號*也應該是一個字符串。

import glob 
all_files = [] 
for file in glob.glob('PRD.FRB.D01.INTRADAY.*.' + file_name_date + '.' + h_server + '.txt''): 
    all_files.append(file) 
+0

運行時,第二天同樣下拉同一個文件。過量撇號:'for glob.glob中的文件('PRD.FRB.D01.INTRADAY。* 。'+ file_name_date +'。'+ h_server +'.txt'):' - 除此之外,它似乎沒問題。 –

+0

對不起,修正了 – Stack