Поиск файла с использованием подстановочного знака - PullRequest
40 голосов
/ 28 июля 2010

Я хочу получить список имен файлов с шаблоном поиска с подстановочными знаками.Как:

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

Как я могу это сделать?

Ответы [ 4 ]

68 голосов
/ 28 июля 2010

Как это:

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

Это приходит прямо отсюда: http://docs.python.org/library/glob.html

18 голосов
/ 28 июля 2010

glob полезно, если вы делаете это внутри Python, однако ваша оболочка может не передавать * (я не знаком с оболочкой Windows).

Например,, когда я делаю следующее:

import sys
print sys.argv

На своей оболочке я набираю:

$ python test.py *.jpg

Я получаю это:

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

Обратите внимание, что argvне содержит "*.jpg"

Важным уроком здесь является то, что большинство оболочек расширяет звездочку в оболочке , прежде чем она будет передана вашему приложению.

В этомслучае, чтобы получить список файлов, я бы просто сделал sys.argv[1:].В качестве альтернативы, вы можете избежать *, так что python видит литерал *.Затем вы можете использовать модуль glob.

$ getFileNames.py "*.jpg"

или

$ getFileNames.py \*.jpg
5 голосов
/ 28 июля 2010
from glob import glob
import sys

files = glob(sys.argv[1])
0 голосов
/ 04 августа 2015

Я добавляю это к предыдущему, потому что я нашел это очень полезным, когда вы хотите, чтобы ваши скрипты работали с несколькими оболочками и с несколькими параметрами, используя *.

Если вы хотите что-то, что работает на каждой оболочке, вы можете сделать следующее (все еще используя glob):

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

Обратите внимание, что он может создавать дубликаты (если у вас есть файл test и вы даете t* и te*), но вы можете просто удалить их, используя set:

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