Python3 glob 模块及应用

🎉摘要:本文详细介绍 Python 内置 glob 模块的用法,包括常用通配符(*、?、[]、**)的含义,glob.glob 与 glob.iglob 方法的区别。提供多个代码示例演示如何匹配文件、递归查找子目录及获取绝对路径,并结合 shutil 模块实现批量文件分类处理的实战工具,帮助开发者高效完成文件路径查找与管理。

Python 中,内置的 glob 模块主要用来按照指定规则匹配文件/目录路径,然后完成文件路径查找,就像 Windows 系统的文件搜索功能,glob 还支持通配符快速筛选文件,非常适合批量处理文件。

常用通配符

通配符作用
*匹配 0 个或多个 任意字符(最常用)
?匹配 1 个 任意字符
[ ]匹配括号内的 任意一个字符(如 [0-9] [a-z])
**匹配 所有层级目录(递归查找,配合 recursive=True 使用)

常用方法

glob.glob(pathname, recursive=False)

用于查找符合规则的文件/目录,返回路径列表。如果 recursive=True,则允许使用递归遍历所有子目录。

glob.iglob(pathname, recursive=False)

也是用于查找符合规则的文件或目录,但是返回迭代器,通过遍历迭代器遍历所有匹配的文件,而不是一次性将所有符合条件的路径全部返回,这样更节省内存,适合海量文件查找。

使用示例

在编写示例前,我们先创建测试目录结构,方便测试,目录结构如下:

其中,demo.py 存放示例代码。

示例 1:匹配任意字符(批量找文件)

使用星号(*)匹配任意字符,例如:

import glob

# 查找当前目录下所有 .txt 文件
txt_files = glob.glob("./*.txt")
print("所有 txt 文件:", txt_files)

# 查找所有文件(不限制后缀)
all_files = glob.glob("./*")
print("当前目录下所有内容:", all_files)

运行结果:

所有 txt 文件: ['.\\test.txt']
test_files 下所有内容: ['.\\demo.py', '.\\subpkg', '.\\test.png', '.\\test.txt', '.\\test.xls', '.\\test.zip']

示例 2:匹配单个字符

使用问号(?)符号匹配单个字符,示例:

import glob

# 查找文件名是 "tes + 1个字符.txt" 的文件(如 test.txt、tesb.txt)
single_files = glob.glob("./tes?.txt")
print("文件列表:", single_files)

运行结果:

文件列表: ['.\\test.txt']

示例 3:匹配指定范围字符

使用中括号([ ])配配范围字符,如 [123] 匹配包含 1 或 2 或 3 的字符,例如:

import glob

# 查找文件名以tes开头,中间是小写字母的 txt 文件
# 如:tesa.txt、tesb.txt 等
num_files = glob.glob("./tes[a-z].txt")
print("文件列表:", num_files)

运行结果:

文件列表: ['.\\test.txt']

示例 4:递归查找所有子目录

设置 recursive 选项为 True,开启递归查找所有子目录。例如:

import glob

# 递归查找当前目录及其所有子目录下的 .txt 文件
all_txt = glob.glob("./**/*.txt", recursive=True)
print("所有的 txt 文件:", all_txt)

运行结果:

所有的 txt 文件: ['.\\test.txt', '.\\subpkg\\sub_test.txt', '.\\subpkg\\subsubpkg\\sub_sub_test.txt']

注意,lob.glob 要 recursive=True 生效,必须满足路径里使用 ** 符号,** 表示匹配所有子目录、递归。

示例 5:迭代器

如果文件数量巨大时,用 iglob 比 glob 更高效,更节约内存。例如:

import glob

# 递归查找当前目录及其所有子目录下的 .txt 文件
# 不一次性加载全部路径,而是逐个加载
for file in glob.iglob("./**/*.txt", recursive=True):
    print("找到文件:", file)

运行结果:

找到文件: .\test.txt
找到文件: .\subpkg\sub_test.txt
找到文件: .\subpkg\subsubpkg\sub_sub_test.txt

示例 6:获取绝对路径

通过 glob.os.path.abspath() 函数将指定路径转换为绝对路径,当然还可以使用os.path.abspath(path) 或 Path(path).absolute() 进行实现。代码:

import glob

# 查找当前目录下所有以 .txt 结尾的文件,并返回相对路径
abs_files = glob.glob("./**/*.txt", recursive=True)

# 将相对路径转换为绝对路径
abs_files = [glob.os.path.abspath(f) for f in abs_files]
for file in abs_files:
    print(file)

运行结果:

d:\$share_dir\workspace\5.demo\python_demo\test.txt
d:\$share_dir\workspace\5.demo\python_demo\subpkg\sub_test.txt
d:\$share_dir\workspace\5.demo\python_demo\subpkg\subsubpkg\sub_sub_test.txt

实战:批量文件处理工具

结合 glob 和 shutil 模块,实现一个自动化文件分类工具,主要功能如下:

  1. 递归查找指定目录下所有文件

  2. 按文件后缀分类(txt、jpg、png、csv、其他)

  3. 自动创建分类文件夹

  4. 移动文件到对应目录

示例代码:

import glob
import os
import shutil

def classify_files(source_dir):
    """
    自动分类文件:按后缀名归类
    :param source_dir: 要分类的源目录
    """
    # 1. 递归查找所有文件(排除目录)
    all_files = glob.glob(os.path.join(source_dir, "**/*"), recursive=True)

    for file_path in all_files:
        # 跳过目录,只处理文件
        if os.path.isdir(file_path):
            continue

        # 2. 获取文件后缀名
        file_ext = os.path.splitext(file_path)[1].lower()  # 如 .txt .jpg
        file_ext = file_ext[1:] if file_ext else "others"  # 去掉点,无后缀归为 others

        # 3. 创建分类目录
        target_dir = os.path.join(source_dir, file_ext + "_files")
        os.makedirs(target_dir, exist_ok=True)

        # 4. 移动文件到目标目录
        try:
            shutil.move(file_path, os.path.join(target_dir, os.path.basename(file_path)))
            print(f"✅ 已移动:{file_path} → {target_dir}")
        except Exception as e:
            print(f"❌ 移动失败:{file_path},原因:{e}")

    print("\n🎉 文件分类完成!")

# 测试:自动分类 test_files 目录下所有文件
classify_files("test_files")

假如 test_files 的目录结构如下图:

执行上述代码后,test_files 目录会自动变成下图:

更多关于 glob 模块的信息请参考 https://docs.python.org/3/library/glob.html 官网文档。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号