import os
= "./管理层讨论与分析/2018/文本/"
file_path = os.listdir(file_path)
file_name_list
for file in file_name_list:
= f"./管理层讨论与分析/2018/文本/{file}"
full_path with open(full_path, "r", encoding='utf-8') as f:
= f.read()
annual_content pass
在进行数据分析时,常常会遇到需要遍历读取某个文件夹中的文件的情况。以文本分析为例,我们可能需要依次读取文件夹中的所有 txt 文件,并进行相应处理。
比如上图中的文件夹,要实现读取上市公司 2018 年管理层讨论与分析的文本,一种方式是使用 os.listdir()
获取所有文件名,然后构造文件路径:
但是这样显然不够优雅😁,glob
模块可以很好的解决这个问题!glob
是 Python 标准库中的一个模块,用于查找符合特定模式的文件或目录名。它通过使用 Unix 风格的路径模式匹配规则来搜索文件系统,常用于批量查找符合某种特定条件的文件。比如,要获取 2018 年上市公司管理层讨论与分析的 txt 文件路径,使用 glob
可以这样完成:
import glob
"./管理层讨论与分析/2018/文本/*.txt") glob.glob(
['./管理层讨论与分析/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
也支持常用的通配符:
*
:匹配任意数量的字符,包括空字符。比如,*.txt
匹配所有 .txt 文件。?
:匹配单个字符。比如,file?.txt
匹配 file1.txt 和 file2.txt,但不匹配 file10.txt。[]
:匹配指定字符范围。比如,file[0-9].txt
匹配 file1.txt 到 file9.txt,但不匹配 file10.txt。
glob.glob()
glob()
是 glob
模块中常用的函数之一,另一个是 iglob()
。其参数如下:
*, root_dir=None, dir_fd=None, recursive=False, include_hidden=False) glob.glob(pathname,
recursive
参数表示是否递归查找。比如,要查找当前目录下的所有 txt 文件:
"./管理层讨论与分析/**/*.txt", recursive=True) glob.glob(
['./管理层讨论与分析/管理层讨论与分析_字段说明.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()
*, root_dir=None, dir_fd=None, recursive=False, include_hidden=False) glob.iglob(pathname,
iglob()
与 glob()
类似,但返回的是一个生成器,适合处理文件数量较多的情况,因为它不会一次性将结果加载到内存中。