2013-04-11 72 views
5

Unix文件名怎麼辦通配符工作PythonPython中的Unix文件名通配符?

指定目錄僅包含子目錄,每個其中有(其中包括)一個文件,其名稱與已知的字符串結尾,說_ext。文件名的第一部分總是不一樣,所以我需要使用這種模式來訪問文件。

我想這樣做:

directory = "." 
listofSubDirs = [x[0] for x in os.walk(directory)] 
listofSubDirs = listofSubDirs[1:] #removing "." 

for subDirectory in listofSubDirs: 
    fileNameToPickle = subDirectory + "/*_ext" #only one such file exists 
    fileToPickle = pickle.load(open(fileNameToPickle, "rb")) 
    ... do stuff ... 

但是,沒有模式匹配情況。它在Python下如何工作?

+3

'glob.glob( '* _ EXT')'支持通配符。 – eumiro 2013-04-11 13:12:49

+0

你應該確實使用glob:http://docs.python.org/2/library/glob.html – Aif 2013-04-11 13:13:20

回答

9

Shell通配符模式在Python中不起作用。改爲使用fnmatchglob模塊來解釋通配符。 fnmatch解釋通配符並讓您匹配字符串,glob在內部使用fnmatch,並與os.listdir()一起給出匹配文件名的列表。

在這種情況下,我會使用fnmatch.filter()

import os 
import fnmatch 

for dirpath, dirnames, files in os.walk(directory): 
    for filename in fnmatch.filter(files, '*_ext'): 
     fileNameToPickle = os.path.join(dirpath, filename) 
     fileToPickle = pickle.load(open(fileNameToPickle, "rb")) 

如果你的結構只包含一個子目錄水平,你也可以使用一個​​3210圖案表達了;在路徑表達式的*/被擴展到滿足所有子目錄:

import glob 
import os 

for filename in glob.glob(os.path.join(directory, '*/*_ext')): 
    # loops over matching filenames in all subdirectories of `directory`.