web-dev-qa-db-fra.com

Rechercher un fichier en utilisant un caractère générique

Je veux obtenir une liste de noms de fichiers avec un modèle de recherche avec un caractère générique. Comme:

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

Comment puis-je faire ceci?

39
Stan

Comme ça:

>>> 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 d'ici: http://docs.python.org/library/glob.html

65
Martin

glob est utile si vous faites cela dans python. Cependant, votre shell ne transmet peut-être pas le * (je ne connais pas le shell Windows).

Par exemple, lorsque je fais ce qui suit:

import sys
print sys.argv

Sur ma coquille, je tape:

$ python test.py *.jpg

J'ai compris:

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

Notez que argv ne contient pas "*.jpg"

La leçon importante à tirer ici est que la plupart des shells élargiront l'astérisque sur le shell , avant qu'il ne soit transmis à votre application.

Dans ce cas, pour obtenir la liste des fichiers, je voudrais juste faire sys.argv[1:]. Alternativement, vous pouvez échapper le *, de sorte que python voie le * littéral. Ensuite, vous pouvez utiliser le module glob.

$ getFileNames.py "*.jpg"

ou

$ getFileNames.py \*.jpg
17
Donald Miner
from glob import glob
import sys

files = glob(sys.argv[1])
5
Daniel Egeberg

J'ajoute ceci à la précédente parce que je trouvais cela très utile lorsque vous voulez que vos scripts fonctionnent sur plusieurs Shell et avec plusieurs paramètres utilisant *.

Si vous voulez quelque chose qui fonctionne sur tous les shells, vous pouvez faire ce qui suit (toujours en utilisant 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 des doublons (si vous avez un fichier test et que vous donnez 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:], []))
0
Holt