📜  如何使用 Glob()函数在Python中递归查找文件?

📅  最后修改于: 2022-05-13 01:55:06.377000             🧑  作者: Mango

如何使用 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)

输出 :

python-glob

使用 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-glob
对于旧版本的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