使用通配符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:], []))