2013-04-11 13 views
5

Come funziona il nome file Unix jolly lavoro da Python?Caratteri jolly del nome file Unix in Python?

una data directory contiene solo sottodirectory, in ognuno dei quali c'è (tra gli altri) un file il cui nome termina con una stringa nota, dicono _ext. La prima parte del nome del file varia sempre, quindi ho bisogno di arrivare al file usando questo modello.

ho voluto fare questo:

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 ... 

Ma nessun pattern matching accade. Come funziona con Python?

+3

'glob.glob ('* _ ext')' supporta i caratteri jolly. – eumiro

+0

Dovresti usare glob: http://docs.python.org/2/library/glob.html – Aif

risposta

9

I modelli jolly di shell non funzionano in Python. Utilizzare i moduli fnmatch o glob per interpretare invece i caratteri jolly. fnmatch interpreta i caratteri jolly e consente di associare stringhe contro di essi, glob utilizza fnmatch internamente, insieme a os.listdir() per fornire un elenco di nomi di file corrispondenti.

In questo caso, userei 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")) 

Se la struttura contiene solo uno livello di sottodirectory, si potrebbe anche utilizzare un modello glob() che esprime quello; il */ nel percorso di espressione si espande per soddisfare tutte le sottodirectory:

import glob 
import os 

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