使用Glob模块快速查找文件

Python
Author

Tom

Published

September 7, 2024

在进行数据分析时,常常会遇到需要遍历读取某个文件夹中的文件的情况。以文本分析为例,我们可能需要依次读取文件夹中的所有 txt 文件,并进行相应处理。

folder

比如上图中的文件夹,要实现读取上市公司 2018 年管理层讨论与分析的文本,一种方式是使用 os.listdir() 获取所有文件名,然后构造文件路径:

import os

file_path = "./管理层讨论与分析/2018/文本/"
file_name_list = os.listdir(file_path)

for file in file_name_list:
    full_path = f"./管理层讨论与分析/2018/文本/{file}"
    with open(full_path, "r", encoding='utf-8') as f:
        annual_content = f.read()
        pass

但是这样显然不够优雅😁,glob 模块可以很好的解决这个问题!glob 是 Python 标准库中的一个模块,用于查找符合特定模式的文件或目录名。它通过使用 Unix 风格的路径模式匹配规则来搜索文件系统,常用于批量查找符合某种特定条件的文件。比如,要获取 2018 年上市公司管理层讨论与分析的 txt 文件路径,使用 glob 可以这样完成:

import glob

glob.glob("./管理层讨论与分析/2018/文本/*.txt")
['./管理层讨论与分析/2018/文本/000001_2018-12-31.txt',
 './管理层讨论与分析/2018/文本/000002_2018-12-31.txt',
 './管理层讨论与分析/2018/文本/000002_2018-06-30.txt',
 './管理层讨论与分析/2018/文本/000004_2018-06-30.txt',
 './管理层讨论与分析/2018/文本/000001_2018-06-30.txt']

可以发现,glob 大大便利了文件和目录查找 。glob 也支持常用的通配符:

glob.glob()

glob()glob 模块中常用的函数之一,另一个是 iglob()。其参数如下:

glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

recursive 参数表示是否递归查找。比如,要查找当前目录下的所有 txt 文件:

glob.glob("./管理层讨论与分析/**/*.txt", recursive=True)
['./管理层讨论与分析/管理层讨论与分析_字段说明.txt',
 './管理层讨论与分析/2020/管理层讨论与分析_字段说明.txt',
 './管理层讨论与分析/2020/文本/000002_2020-12-31.txt',
 './管理层讨论与分析/2020/文本/000001_2020-12-31.txt',
 './管理层讨论与分析/2020/文本/000001_2020-06-30.txt',
 './管理层讨论与分析/2020/文本/000004_2020-06-30.txt',
 './管理层讨论与分析/2020/文本/000002_2020-06-30.txt',
 './管理层讨论与分析/2019/管理层讨论与分析_字段说明.txt',
 './管理层讨论与分析/2019/文本/000001_2019-06-30.txt',
 './管理层讨论与分析/2019/文本/000001_2019-12-31.txt',
 './管理层讨论与分析/2019/文本/000004_2019-06-30.txt',
 './管理层讨论与分析/2019/文本/000002_2019-12-31.txt',
 './管理层讨论与分析/2019/文本/000002_2019-06-30.txt',
 './管理层讨论与分析/2021/管理层讨论与分析_字段说明.txt',
 './管理层讨论与分析/2021/文本/000001_2021-12-31.txt',
 './管理层讨论与分析/2021/文本/000002_2021-12-31.txt',
 './管理层讨论与分析/2021/文本/000005_2021-06-30.txt',
 './管理层讨论与分析/2021/文本/000004_2021-12-31.txt',
 './管理层讨论与分析/2021/文本/000004_2021-06-30.txt',
 './管理层讨论与分析/2022/管理层讨论与分析_字段说明.txt',
 './管理层讨论与分析/2022/文本/000002_2022-06-30.txt',
 './管理层讨论与分析/2022/文本/000004_2022-12-31.txt',
 './管理层讨论与分析/2022/文本/000005_2022-12-31.txt',
 './管理层讨论与分析/2022/文本/000002_2022-12-31.txt',
 './管理层讨论与分析/2022/文本/000001_2022-12-31.txt',
 './管理层讨论与分析/2018/管理层讨论与分析_字段说明.txt',
 './管理层讨论与分析/2018/文本/000001_2018-12-31.txt',
 './管理层讨论与分析/2018/文本/000002_2018-12-31.txt',
 './管理层讨论与分析/2018/文本/000002_2018-06-30.txt',
 './管理层讨论与分析/2018/文本/000004_2018-06-30.txt',
 './管理层讨论与分析/2018/文本/000001_2018-06-30.txt']

glob.iglob()

glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

iglob()glob() 类似,但返回的是一个生成器,适合处理文件数量较多的情况,因为它不会一次性将结果加载到内存中。