python如何利用pathlib模块,获得指定目录下的文件列表
发布于 作者:苏南大叔 来源:程序如此灵动~
书接上文,需求是获得指定目录下面的文件或文件夹名称集合。上一篇文章中,使用了python下的glob.glob()以及glob.iglob()来实现这个需求。但是,遗留着一个重要问题,就是一些特殊文件(例如.htaccess)是无法识别的。在本文中,换另外一个pathlib下的glob()函数,在实现同样一个需求。

大家好,这里是苏南大叔的程序如此灵动博客,这里介绍苏南大叔和计算机代码的故事。本文描述python下的pathlib模块下的glob()函数,它和glob模块下的glob()函数很类似,但是能够解决特殊文件的识别问题。本文测试环境:win10,python@3.6.8。
测试代码
依然采用原来的测试目录结构,一共三层目录,分别是dir、dir/sub/、dir/sub/subsub/。每层下都有这么几个文件:.htaccess,s1.txt等。如图所示:

前置文章链接:
测试代码:
import pathlib
f1 = pathlib.Path("./dir/").glob('*')
f2 = pathlib.Path("./").glob('dir/*')f3 = pathlib.Path("./dir/").glob('**')
f4 = pathlib.Path("./").glob('dir/**')f5 = pathlib.Path("./dir/").glob('*.*')
f6 = pathlib.Path("./").glob('dir/*.*')上面的代码中的每两行的写法,最终结果都是一致的。
f7 = pathlib.Path("./dir/").glob('星/s?.txt')
f8 = pathlib.Path("./dir/").glob('星星/s?.txt')
f9 = pathlib.Path("./dir/").glob('星.星/s?.txt')这里的通配符匹配结果,和glob.glob()里面,是差不多的。结果输出:
{WindowsPath('dir/sub/s2.txt')}
{WindowsPath('dir/sub/s2.txt'), WindowsPath('dir/sub/subsub/s2.txt'), WindowsPath('dir/s2.txt')}
set()输出结果
| 函数 | 结果类型 |
|---|---|
glob.glob() | list |
glob.iglob() | generator |
pathlib.Path('./').glob() | generator |
测试代码:
import glob
import pathlib
f10 = glob.iglob('dir/s?.txt')
f11 = pathlib.Path("./dir/").glob('星/s?.txt')
print(list(f10)) # {'dir\\s2.txt'}
print(list(f11)) # {WindowsPath('dir/sub/s2.txt')}
f10 = glob.iglob('dir/s?.txt')
f11 = pathlib.Path("./dir/").glob('星/s?.txt')
print([f for f in f10]) # {'dir\\s2.txt'}
print([f for f in f11]) # {WindowsPath('dir/sub/s2.txt')}注意:
- 两者对于路径的表述输出,也是不一样的。
- 两者都是迭代器类型的,所以只能访问一次。

pathlib.对比glob.
pathlib模块下的glob(),
- 只需要填写路径信息即可,不需要参数
recursive。 - 路径信息中,可以像以前一样传递,也可以分开写。
- 结果输出是个迭代器类型。
对比上一篇文章中的glob.glob()的话,对比如下:
| 函数 | 路径写法 | 是否回归 | 最终写法 |
|---|---|---|---|
| glob.glob() | dir/** | 默认false | glob.glob("dir/**",recursive=True) |
| pathlib.Path("./").glob() | dir/** | 不需要 | pathlib.Path("./").glob("dir/**") |
通配符结果变化:
| 通配符 | pathlib. | glob. |
|---|---|---|
* | 当前所有文件及文件夹(含"点文件") | 当前目录所有文件及文件夹 |
** | 所有的目录,不包括文件 | recursive=true时,所有目录及文件(不含"点文件") |
*.* | 当前目录下的所有文件(含"点文件") | 当前目录下的所有文件(不含"点文件") |
除了识别特殊文件(例如:.htaccess文件)外,对于**的解释也是不同的,差别很大。
相关链接
- https://newsn.net/say/python-glob-glob.html
- https://newsn.net/say/python-pathlib-glob.html
- https://newsn.net/say/centos-tree.html
- https://newsn.net/say/du-filesize.html
- https://newsn.net/say/mac-md5.html
总结
整体上来说,苏南大叔认为:
- 使用
pathlib模块下的glob()对比glob模块下面的glob(),前者的结果更加合理一些,因为输出哪些特殊文件,但是写法上不如glob()下更简单一些。推荐使用:pathlib.Path('./').glob()。 - 对于
**的解释,两者差别巨大,请注意区分。 - https://newsn.net/tag/python/