📜  glob – 文件名模式匹配

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

glob – 文件名模式匹配

Glob 模块根据 Unix shell 规定的规则搜索所有路径名,寻找与指定模式匹配的文件。如此获得的结果以任意顺序返回。一些需求需要遍历某个位置的文件列表,大部分具有特定的模式。 Python 的 glob 模块有几个函数可以帮助列出与指定文件夹下的给定模式匹配的文件。

模式匹配是使用os.scandir()fnmatch.fnmatch()函数完成的,而不是通过实际调用子 shell。不像 fnmatch.fnmatch(), glob 将以点(.)开头的文件名视为特殊情况。对于波浪号和 shell 变量扩展,使用os.path.expanduser()os.path.expandvars()函数。

模式规则

  • 遵循标准的 Unix 路径扩展规则。
  • 支持的特殊字符:两种不同的通配符 - *, ?和用 [] 表示的字符范围。
  • 模式规则应用于文件名的段(在路径分隔符 / 处停止)。
  • 模式中的路径可以是相对的或绝对的。

应用

  • 在您的程序需要在文件系统上查找名称与模式匹配的文件列表的任何情况下,它都非常有用。
  • 如果您需要具有特定扩展名、前缀或中间任何常见字符串的文件名列表,请使用 glob 而不是自己编写代码来扫描目录内容。

Glob 中的函数:

  • glob(pathname, *, recursive=False) -它返回匹配给定路径名的路径名列表,它必须是一个包含路径规范的字符串。列表也可以为空。
  • iglob(pathname, *, recursive=False)-此方法创建一个Python生成器对象,用于列出给定目录下的文件。还返回一个迭代器,该迭代器产生与 glob() 相同的值,而不实际同时存储它们。
  • 转义(路径名) -它允许转义给定的字符序列。您会发现它可以方便地定位文件名中包含某些字符的文件,并匹配可能包含特殊字符的任意字面量字符串。

下面给出的实现可以帮助您了解如何将这个模块付诸实践:

示例 1:

Python3
import glob
  
# search .py files
# in the current working directory
for py in glob.glob("*.py"):
    print(py)


Python3
import glob
  
# Using character ranges []
print('Finding file using character ranges [] :- ')
print(glob.glob('./[0-9].*'))
  
# Using wildcard character *
print('\n Finding file using wildcard character * :- ')
print(glob.glob('*.gif'))
  
# Using wildcard character ?
print('\n Finding file using wildcard character ? :- ')
print(glob.glob('?.gif'))
  
# Using recursive attribute
print('\n Finding files using recursive attribute :- ')
print(glob.glob('**/*.txt', recursive=True))


Python3
import glob
  
gen = glob.iglob("*.py")
# returns class type of gen
type(gen)
  
for py in gen:
    print(py)


Python3
import glob
  
char_seq = "-_#"
  
for spcl_char in char_seq:
    esc_set = "*" + glob.escape(spcl_char) + "*" + ".py"
      
    for py in (glob.glob(esc_set)):
        print(py)


输出 :

示例 2:字符通配符和范围的程序

如果 recursive 为真,则模式“**”将匹配任何文件和零个或多个目录、子目录和目录的符号链接。在大型目录树中使用“**”模式可能会消耗过多的时间。

蟒蛇3

import glob
  
# Using character ranges []
print('Finding file using character ranges [] :- ')
print(glob.glob('./[0-9].*'))
  
# Using wildcard character *
print('\n Finding file using wildcard character * :- ')
print(glob.glob('*.gif'))
  
# Using wildcard character ?
print('\n Finding file using wildcard character ? :- ')
print(glob.glob('?.gif'))
  
# Using recursive attribute
print('\n Finding files using recursive attribute :- ')
print(glob.glob('**/*.txt', recursive=True))

输出 :

示例 3:

蟒蛇3

import glob
  
gen = glob.iglob("*.py")
# returns class type of gen
type(gen)
  
for py in gen:
    print(py)

输出 :

示例 4:

蟒蛇3

import glob
  
char_seq = "-_#"
  
for spcl_char in char_seq:
    esc_set = "*" + glob.escape(spcl_char) + "*" + ".py"
      
    for py in (glob.glob(esc_set)):
        print(py)

输出 :