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/
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。