2010-07-27 9 views
37

Desidero ottenere un elenco di nomi di file con un modello di ricerca con un carattere jolly. Come:Cercare un file utilizzando un carattere jolly

getFilenames.py c:\PathToFolder\* 
getFilenames.py c:\PathToFolder\FileType*.txt 
getFilenames.py c:\PathToFolder\FileTypeA.txt 

Come posso fare questo?

risposta

59

Ti piace questa:

>>> import glob 
>>> glob.glob('./[0-9].*') 
['./1.gif', './2.txt'] 
>>> glob.glob('*.gif') 
['1.gif', 'card.gif'] 
>>> glob.glob('?.gif') 
['1.gif'] 

Questo deriva direttamente da qui: http://docs.python.org/library/glob.html

+2

Come sottolinea Donald minatore nel altra risposta, questo non è del tutto corretto a seconda della shell utilizzata. –

3
from glob import glob 
import sys 

files = glob(sys.argv[1]) 
17

glob è utile se si sta facendo questo in entro pitone, tuttavia, il guscio non può essere passato nella * (Non ho familiarità con la shell di Windows).

Per esempio, quando faccio la seguente:

import sys 
print sys.argv 

Sul mio guscio, digito:

$ python test.py *.jpg 

ottengo questo:

['test.py', 'test.jpg', 'wasp.jpg'] 

noti che argv non lo fa contiene "*.jpg"

La lezione importante qui è che la maggior parte delle shell espanderà l'asterisco nella shell prima che venga trasferita all'applicazione .

In questo caso, per ottenere l'elenco dei file, vorrei solo fare sys.argv[1:]. In alternativa, è possibile sfuggire allo *, in modo che Python visualizzi il valore letterale *. Quindi, è possibile utilizzare il modulo glob.

$ getFileNames.py "*.jpg" 

o

$ getFileNames.py \*.jpg 
0

sto aggiungendo questo al precedente, perché ho trovato questo molto utile quando si desidera gli script per lavorare sul guscio multipla e con più parametri utilizzando *.

Se si desidera qualcosa che funziona su ogni conchiglie, è possibile effettuare le seguenti operazioni (ancora utilizzando glob):

>>> import glob 
>>> from functools import reduce # if using python 3+ 
>>> reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], []) 

Nota che può produrre duplicare (se si dispone di un file test e si dà t* e te*), ma si può semplicemente rimossi con un set:

>>> set(reduce(lambda r, x: r + glob.glob(x), sys.argv[1:], [])) 
Problemi correlati