2013-04-11 12 views
5

Jak działa nazwa pliku Unix z numerem od Python?Unixowe znaki wieloznaczne nazw plików w języku Python?

Podany katalog zawiera tylko podkatalogi, w każdym z których istnieje (między innymi) jeden plik, którego nazwa kończy ze znanym ciągiem, powiedzmy _ext. Pierwsza część nazwy pliku zawsze się zmienia, więc muszę dostać się do pliku za pomocą tego wzorca.

Chciałem to zrobić:

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

Ale nie pasujące do wzorca dzieje. Jak to działa w Pythonie?

+3

'glob.glob ('* _ ext')' obsługuje symboli wieloznacznych. – eumiro

+0

Powinieneś używać globu: http://docs.python.org/2/library/glob.html – Aif

Odpowiedz

9

Wzory wieloznaczne powłoki nie działają w języku Python. Użyj modułów fnmatch lub glob do interpretowania symboli wieloznacznych. fnmatch interpretuje symbole wieloznaczne i pozwala dopasować łańcuchy do nich, glob używa wewnętrznie, wraz z os.listdir(), aby podać listę pasujących nazw plików.

W tym przypadku użyłbym 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")) 

Jeśli struktura zawiera tylko jeden poziom podkatalogów, można również użyć glob() wzór, który wyraża to; */ w ścieżce wypowiedzi rozpręża się dopasować wszystkie podkatalogi:

import glob 
import os 

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