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?
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
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
from glob import glob
import sys
files = glob(sys.argv[1])
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:], []))