使用正则表达式的os.walk
我想要获取一份符合我所拥有的正则表达式的文件列表。我想我应该使用os.walk这个方法,但我该如何把它和正则表达式结合起来呢?
谢谢。
2 个回答
5
如果你的正则表达式可以转换成像 foo/*.txt
这样的命令行表达式,那么你就可以使用 glob
这个工具。
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
8
我不知道标准库里有没有实现这个功能,但其实写起来并不难:
import os, os.path
def iter_matching(dirpath, regexp):
"""Generator yielding all files under `dirpath` whose absolute path
matches the regular expression `regexp`.
Usage:
>>> for filename in iter_matching('/', r'/home.*\.bak'):
.... # do something
"""
for dir_, dirnames, filenames in os.walk(dirpath):
for filename in filenames:
abspath = os.path.join(dir_, filename)
if regexp.match(abspath):
yield abspath
或者更通用一点的写法:
import os, os.path
def filter_filenames(dirpath, predicate):
"""Usage:
>>> for filename in filter_filenames('/', re.compile(r'/home.*\.bak').match):
.... # do something
"""
for dir_, dirnames, filenames in os.walk(dirpath):
for filename in filenames:
abspath = os.path.join(dir_, filename)
if predicate(abspath):
yield abspath