2010-07-27 8 views
37

Je veux obtenir une liste de noms de fichiers avec un motif de recherche avec un caractère générique. Comme:Rechercher un fichier en utilisant un caractère générique

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

Comment est-ce que je peux faire ceci?

Répondre

59

Comme ceci:

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

Cela vient directement ici: http://docs.python.org/library/glob.html

+2

Comme Donald Miner souligne dans l'autre réponse, ce n'est pas tout à fait correct selon le shell utilisé. –

3
from glob import glob 
import sys 

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

glob est utile si vous faites cela dans l'intérieur de python, cependant, votre shell ne peut pas être passer dans la * (Je ne suis pas familier avec le shell Windows).

Par exemple, quand je fais ce qui suit:

import sys 
print sys.argv 

Sur ma coquille, je tape:

$ python test.py *.jpg 

Je reçois ceci:

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

Notez que argv ne le fait pas contenir "*.jpg"

La leçon importante ici est que la plupart des shells développeront l'astérisque au shell, avant qu'il ne soit passé à votre application.

Dans ce cas, pour obtenir la liste des fichiers, je ferais simplement sys.argv[1:]. Alternativement, vous pouvez échapper le *, de sorte que Python voit le littéral *. Ensuite, vous pouvez utiliser le module glob.

$ getFileNames.py "*.jpg" 

ou

$ getFileNames.py \*.jpg 
0

J'ajoute cela à la précédente parce que je trouve cela très utile lorsque vous voulez que vos scripts shell pour travailler sur plusieurs et avec plusieurs paramètres à l'aide *.

Si vous voulez quelque chose qui fonctionne sur chaque coque, vous pouvez effectuer les opérations suivantes (toujours glob):

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

Notez qu'il peut produire en double (si vous avez un fichier test et vous donner t* et te*), mais vous pouvez simplement les supprimer en utilisant un set:

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