2013-04-11 25 views
5

Unix dosya adı nasıl joker karakterlerPython?Unix dosya adı joker kartları mı?

Belirli bir dizin (diğerleri arasında) var olduğu her birinde sadece alt dizinleri, isim bilinen bir dizeyle sona eren bir dosya, _ext demek içerir. Dosya adının ilk kısmı her zaman değişir, bu yüzden bu deseni kullanarak dosyaya gitmem gerekiyor.

ben bunu yapmak istedim:

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

Ancak hiçbir desen eşleştirme gerçekleşir. Python altında nasıl çalışır?

+3

'glob.glob ('* _ ext')' karakterler kullanılır. – eumiro

+0

Gerçekten de glob kullanmalısınız: http://docs.python.org/2/library/glob.html – Aif

cevap

9

Kabuk joker karakterleri Python'da çalışmıyor. Bunun yerine joker karakterleri yorumlamak için fnmatch veya glob modüllerini kullanın. fnmatch, joker karakterleri yorumlar ve dizeleri bunlarla eşleştirmenize olanak sağlar,, fnmatch'u, eşleşen dosya adlarının bir listesini vermek için os.listdir() ile birlikte kullanır.

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")) 

Yapınızın alt dizin sadece biri seviyesini içeriyorsa, bunu da ifade eden bir glob() deseni kullanabilirsiniz;:

Bu durumda

, ben fnmatch.filter() kullanmayı tercih ediyorum yolunun ifadesinin yılında */ tüm alt dizinleri maç için genişletilir:

import glob 
import os 

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