2013-04-11 5 views
5

Wie funktioniert Unix Dateiname Wildcards Arbeit von Python?Unix Dateinamen Wildcards in Python?

Ein bestimmtes Verzeichnis enthält nur Unterverzeichnisse, in denen jeweils (unter anderem) ist eine Datei, deren Name endet mit einer bekannten Zeichenfolge, sagen _ext. Der erste Teil des Dateinamens variiert immer, daher muss ich mit diesem Muster zur Datei gehen.

Ich wollte, dies zu tun:

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

aber kein Musterabgleich geschieht. Wie funktioniert es unter Python?

+3

'glob.glob ('* _ ext')' unterstützt Platzhalter. – eumiro

+0

Sie sollten tatsächlich glob: http://docs.python.org/2/library/glob.html verwenden – Aif

Antwort

9

Shell-Platzhaltermuster funktionieren in Python nicht. Verwenden Sie die Module fnmatch oder glob, um stattdessen die Wildcards zu interpretieren. fnmatch interpretiert Wildcards und lässt Sie Strings mit ihnen abgleichen, glob verwendet fnmatch intern zusammen mit os.listdir(), um Ihnen eine Liste der passenden Dateinamen zu geben.

In diesem Fall würde ich verwenden 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")) 

Wenn Ihre Struktur nur ein Verzeichnisse eine Ebene enthält, können Sie auch ein glob() Muster, das das zum Ausdruck bringt verwenden könnte; die */ im Pfad Ausdrucks erweitert wird alle Unterverzeichnisse entsprechen:

import glob 
import os 

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