使用通配符search文件
我想用通配符search带有search模式的文件名列表。 喜欢:
getFilenames.py c:\PathToFolder\* getFilenames.py c:\PathToFolder\FileType*.txt getFilenames.py c:\PathToFolder\FileTypeA.txt
我怎样才能做到这一点?
喜欢这个:
>>> 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
glob
是有用的,如果你在python中做这个,但是,你的shell可能不会传入*
(我不熟悉windows shell)。
例如,当我做到以下几点:
import sys print sys.argv
在我的shell上,我input:
$ python test.py *.jpg
我得到这个:
['test.py', 'test.jpg', 'wasp.jpg']
请注意, argv
不包含"*.jpg"
这里重要的一个教训是, 大多数shell在将shell传递到应用程序之前将在shell中扩展星号 。
在这种情况下,要获取文件列表,我只需要执行sys.argv[1:]
。 或者,你可以转义*
,这样python就可以看到文字*
。 然后,你可以使用glob
模块。
$ getFileNames.py "*.jpg"
要么
$ getFileNames.py \*.jpg
from glob import glob import sys files = glob(sys.argv[1])
我将这个添加到前面,因为我发现这非常有用,当你希望你的脚本在多个shell和多个参数下使用*
。
如果你想要的东西适用于每一个shell,你可以做以下事情(仍然使用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:], []))