我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

书接上文,需求是获得指定目录下面的文件或文件夹名称集合。上一篇文章中,使用了python下的glob.glob()以及glob.iglob()来实现这个需求。但是,遗留着一个重要问题,就是一些特殊文件(例如.htaccess)是无法识别的。在本文中,换另外一个pathlib下的glob()函数,在实现同样一个需求。

苏南大叔:python如何利用pathlib模块,获得指定目录下的文件列表 - pathlib-glob
python如何利用pathlib模块,获得指定目录下的文件列表(图3-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里介绍苏南大叔和计算机代码的故事。本文描述python下的pathlib模块下的glob()函数,它和glob模块下的glob()函数很类似,但是能够解决特殊文件的识别问题。本文测试环境:win10python@3.6.8

测试代码

依然采用原来的测试目录结构,一共三层目录,分别是dirdir/sub/dir/sub/subsub/。每层下都有这么几个文件:.htaccess,s1.txt等。如图所示:

苏南大叔:python如何利用pathlib模块,获得指定目录下的文件列表 - 测试目录结构
python如何利用pathlib模块,获得指定目录下的文件列表(图3-2)

前置文章链接:

测试代码:

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')}

注意:

  • 两者对于路径的表述输出,也是不一样的。
  • 两者都是迭代器类型的,所以只能访问一次。

苏南大叔:python如何利用pathlib模块,获得指定目录下的文件列表 - 测试代码结果输出
python如何利用pathlib模块,获得指定目录下的文件列表(图3-3)

pathlib.对比glob.

pathlib模块下的glob()

  • 只需要填写路径信息即可,不需要参数recursive
  • 路径信息中,可以像以前一样传递,也可以分开写。
  • 结果输出是个迭代器类型。

对比上一篇文章中的glob.glob()的话,对比如下:

函数路径写法是否回归最终写法
glob.glob()dir/**默认falseglob.glob("dir/**",recursive=True)
pathlib.Path("./").glob()dir/**不需要pathlib.Path("./").glob("dir/**")

通配符结果变化:

通配符pathlib.glob.
*当前所有文件及文件夹(含"点文件")当前目录所有文件及文件夹
**所有的目录,不包括文件recursive=true时,所有目录及文件(不含"点文件")
*.*当前目录下的所有文件(含"点文件")当前目录下的所有文件(不含"点文件")

除了识别特殊文件(例如:.htaccess文件)外,对于**的解释也是不同的,差别很大。

相关链接

总结

整体上来说,苏南大叔认为:

  • 使用pathlib模块下的glob() 对比 glob模块下面的glob(),前者的结果更加合理一些,因为输出哪些特殊文件,但是写法上不如glob()下更简单一些。推荐使用:pathlib.Path('./').glob()
  • 对于**的解释,两者差别巨大,请注意区分。
  • https://newsn.net/tag/python/
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python