这是我所拥有的:
glob(os.path.join('src','*.c'))
但是我想搜索src的子文件夹。这样做是可行的:
glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))
但这显然是有限和笨拙的。
这是我所拥有的:
glob(os.path.join('src','*.c'))
但是我想搜索src的子文件夹。这样做是可行的:
glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))
但这显然是有限和笨拙的。
当前回答
除了建议的答案,你还可以用一些惰性生成和列表理解魔法来做到这一点:
import os, glob, itertools
results = itertools.chain.from_iterable(glob.iglob(os.path.join(root,'*.c'))
for root, dirs, files in os.walk('src'))
for f in results: print(f)
除了适合一行并避免内存中不必要的列表之外,这还有一个很好的副作用,你可以以类似于**操作符的方式使用它,例如,你可以使用os.path。Join (root, 'some/path/*.c')以获取SRC所有子目录下具有此结构的所有。c文件。
其他回答
你需要使用操作系统。行走以收集符合条件的文件名。例如:
import os
cfiles = []
for root, dirs, files in os.walk('src'):
for file in files:
if file.endswith('.c'):
cfiles.append(os.path.join(root, file))
简化版的Johan Dahlin的回答,没有fnmatch。
import os
matches = []
for root, dirnames, filenames in os.walk('src'):
matches += [os.path.join(root, f) for f in filenames if f[-2:] == '.c']
我修改了glob模块,以支持**的递归配色,例如:
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
https://github.com/miracle2k/python-glob2/
当你想为你的用户提供使用**语法的能力时很有用,因此os.walk()本身不够好。
import os, glob
for each in glob.glob('path/**/*.c', recursive=True):
print(f'Name with path: {each} \nName without path: {os.path.basename(each)}')
Glob.glob ('*.c'):匹配当前目录下所有以.c结尾的文件 Glob.glob ('*/*.c'):与1相同 Glob.glob ('**/*.c'):只匹配直接子目录中以.c结尾的所有文件,不匹配当前目录 glob.glob('*.c',recursive=True):与1相同 glob.glob('*/*.c',recursive=True):与3相同 glob.glob('**/*.c',recursive=True):匹配当前目录和所有子目录中以.c结尾的所有文件
另一种方法是只使用glob模块。只需给rglob方法添加一个起始基本目录和一个要匹配的模式,它就会返回一个匹配文件名的列表。
import glob
import os
def _getDirs(base):
return [x for x in glob.iglob(os.path.join( base, '*')) if os.path.isdir(x) ]
def rglob(base, pattern):
list = []
list.extend(glob.glob(os.path.join(base,pattern)))
dirs = _getDirs(base)
if len(dirs):
for d in dirs:
list.extend(rglob(os.path.join(base,d), pattern))
return list