Python-glob

Python 标准库——glob 模块

glob 是 Python 标准库中的一个模块,它提供了一种简单的方式来查找符合特定模式的文件路径。这个模块特别适用于在文件系统中搜索文件,它支持多种通配符:

  • *:匹配任意数量(包括零个)的字符
  • ?:匹配任意单个字符
  • []:匹配指定范围内的字符,例如 [a-z] 匹配任意小写字母,[0-9] 匹配任意数字
  • [!...]:匹配不在指定范围内的字符

glob 模块的具体使用

glob模块方法属性:

1
2
3
4
5
6
7
>>> dir(glob)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__spec__', '_glob0', '_glob1', '_glob2', '_iglob',
'_ishidden', '_isrecursive', '_iterdir', '_rlistdir', 'escape', 'fnmatch',
'glob', 'glob0', 'glob1', 'has_magic', 'iglob', 'magic_check',
'magic_check_bytes', 'os', 're']
>>>

glob模块常用的两个方法有: glob.glob() & glob.iglob,下面详细介绍

  1. glob.glob(pathname, *, recursive=False): 这个函数返回一个列表,包含了与 pathname 参数指定的模式匹配的所有文件路径。如果不指定 recursive 参数或者将其设置为 False,则只匹配当前目录下的文件。如果设置为 True,则会递归地搜索所有子目录

    参数解释:

    • pathname:要匹配的文件路径模式,可以包含通配符
    • recursive(可选):布尔值,指定是否递归搜索子目录。默认为 False

    返回值:

    • 一个列表,包含了所有匹配的文件路径
    1
    2
    3
    4
    5
    import glob
    # 匹配当前目录下所有以 '.txt' 结尾的文件
    txt_files = glob.glob('*.txt')
    # 在路径模式 'data/**/*.csv' 中,第一个 * 匹配 data 目录下的任何文件或子目录,而 ** 则指示 glob 继续在这些子目录中递归搜索,直到找到所有 .csv 文件,如果采用这写法,recursive=True可以不写
    csv_files = glob.glob('data/**/*.csv', recursive=True)
  2. glob.iglob(pathname, *, recursive=False): 这个函数与 glob.glob() 类似,但它返回的是一个迭代器,而不是一个列表。这在处理大量文件时非常有用,因为它不需要一次性加载所有匹配的文件路径,从而节省内存。

    参数和返回值与 glob.glob() 相同,只是返回的是一个迭代器。

    1
    2
    3
    4
    import glob
    # 使用迭代器递归匹配 'data' 目录下所有 '.csv' 文件
    for csv_file in glob.iglob('data/**/*.csv', recursive=True):
    print(csv_file)

配合 Python 中 str 加法的语法糖,这两个函数可以用得十分简洁高效,例如加载所有保存的上下采样为 B 和 A 的 A+B.pth 模型:

1
2
3
4
5
6
down_sampling = ["avg-pooling", "max-pooling", "dysample"]
up_sampling = ["bilinear", "max-unpooling", "dysample"]
for down in down_sampling:
for up in up_sampling:
model = torch.load(down + "+" + up + ".pth")
# inference...