使用通配符搜索文件

问题描述 投票:45回答:4

我想得到一个带有通配符的搜索模式的文件名列表。比如:

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

我怎么能这样做?

python file wildcard
4个回答
76
投票

你可以这样做。

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

注意: 如果该目录包含以 . 它们不会被默认匹配。例如,考虑一个包含 card.gif.card.gif:

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

这个直接从这里来。http:/docs.python.orglibraryglob.html。


19
投票

glob 如果你是在python中做这件事,那么就会很有用,但是,你的shell可能没有传入 * 我对windows shell不熟悉)。

例如,当我做以下操作时。

import sys
print sys.argv

在我的shell里,我输入:

$ python test.py *.jpg

我得到这个

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

注意 argv 不含 "*.jpg"

这里的重要教训是 大多数炮弹会在炮弹处扩大星号。,然后再传递给你的应用程序。

在这种情况下,为了得到文件列表,我只需要执行 sys.argv[1:]. 或者,你可以逃避 *所以,python看到的是字面的 *. 然后,你可以使用 glob 模块。

$ getFileNames.py "*.jpg"

$ getFileNames.py \*.jpg

6
投票
from glob import glob
import sys

files = glob(sys.argv[1])

0
投票

我在前面的基础上增加了这个,因为我发现当你想让你的脚本在多个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:], []))
© www.soinside.com 2019 - 2024. All rights reserved.