如何使用 Glob()函数在Python中递归查找文件?
Glob 是一个通用术语,用于定义根据与 Unix shell 相关的规则匹配指定模式的技术。 Linux 和 Unix 系统和 shell 也支持 glob,并且还在系统库中提供函数glob()
。
在Python中, glob 模块用于检索与指定模式匹配的文件/路径名。 glob 的模式规则遵循标准的 Unix 路径扩展规则。还预测,根据基准,它比其他方法更快地匹配目录中的路径名。使用 glob,除了精确的字符串搜索,我们还可以使用通配符("*, ?, [ranges])
来使路径检索更加简单方便。
注意:这个模块是Python自带的,所以不需要在外部安装。
例子:
# Python program to demonstrate
# glob using different wildcards
import glob
print('Named explicitly:')
for name in glob.glob('/home/geeks/Desktop/gfg/data.txt'):
print(name)
# Using '*' pattern
print('\nNamed with wildcard *:')
for name in glob.glob('/home/geeks/Desktop/gfg/*'):
print(name)
# Using '?' pattern
print('\nNamed with wildcard ?:')
for name in glob.glob('/home/geeks/Desktop/gfg/data?.txt'):
print(name)
# Using [0-9] pattern
print('\nNamed with wildcard ranges:')
for name in glob.glob('/home/geeks/Desktop/gfg/*[0-9].*'):
print(name)
输出 :
使用 Glob()函数递归查找文件
我们可以直接从 glob 模块使用函数glob.glob()
或glob.iglob()
从目录/文件和子目录/子文件中递归检索路径。
句法:
glob.glob(pathname, *, recursive=False)
glob.iglob(pathname, *, recursive=False)
注意:当递归设置为True
时,“ **
”后跟路径分隔符('./**/')
将匹配任何文件或目录。
例子:
# Python program to find files
# recursively using Python
import glob
# Returns a list of names in list files.
print("Using glob.glob()")
files = glob.glob('/home/geeks/Desktop/gfg/**/*.txt',
recursive = True)
for file in files:
print(file)
# It returns an iterator which will
# be printed simultaneously.
print("\nUsing glob.iglob()")
for filename in glob.iglob('/home/geeks/Desktop/gfg/**/*.txt',
recursive = True):
print(filename)
输出 :
对于旧版本的Python:
最简单的方法是使用 os.walk(),因为它经过专门设计和优化,允许递归浏览目录树。或者我们也可以使用 os.listdir() 来获取目录和子目录下的所有文件,然后过滤掉。
让我们通过一个例子来看看——
例子:
# Python program to find files
# recursively using Python
import os
# Using os.walk()
for dirpath, dirs, files in os.walk('src'):
for filename in files:
fname = os.path.join(dirpath,filename)
if fname.endswith('.c'):
print(fname)
"""
Or
We can also use fnmatch.filter()
to filter out results.
"""
for dirpath, dirs, files in os.walk('src'):
for filename in fnmatch.filter(files, '*.c'):
print(os.path.join(dirpath, filename))
# Using os.listdir()
path = "src"
dir_list = os.listdir(path)
for filename in fnmatch.filter(dir_list,'*.c'):
print(os.path.join(dirpath, filename))
输出 :
./src/add.c
./src/subtract.c
./src/sub/mul.c
./src/sub/div.c
./src/add.c
./src/subtract.c
./src/sub/mul.c
./src/sub/div.c
./src/add.c
./src/subtract.c
./src/sub/mul.c
./src/sub/div.c