python工具包 glob 教程

glob教程

官网说明网址

参见python网址
glob模块官网说明

glob 简介

glob 模块会按照 Unix shell 所使用的规则找出所有匹配特定模式的路径名称,但返回结果的顺序是不确定的。 波浪号扩展不会生效,但 *, ? 以及用 [] 表示的字符范围将被正确地匹配。 这是通过配合使用 os.scandir() 和 fnmatch.fnmatch() 函数来实现的,而不是通过实际发起调用子 shell。
请注意以点号 (.) 打头的文件只能用同样以点号打头的模式来匹配,这不同于 fnmatch.fnmatch() 或 pathlib.Path.glob()。 (对于波浪号和 shell 变量扩展,请使用 os.path.expanduser() 和 os.path.expandvars()。)

对于字面值匹配,请将原字符用方括号括起来。 例如,‘[?]’ 将匹配字符 ‘?’。

glob.glob(pathname, , root_dir=None, dir_fd=None, recursive=False)
Return a possibly empty list of path names that match pathname, which must be a string containing a path specification. pathname can be either absolute (like /usr/src/Python-1.5/Makefile) or relative (like …/…/Tools/
/*.gif), and can contain shell-style wildcards. Broken symlinks are included in the results (as in the shell). Whether or not the results are sorted depends on the file system. If a file that satisfies conditions is removed or added during the call of this function, whether a path name for that file be included is unspecified.

如果 root_dir 不为 None,则它应当是指明要搜索的根目录的 path-like object。 它用在 glob() 上与在调用它之前改变当前目录有相同的效果。 如果 pathname 为相对路径,结果将包含相对于 root_dir 的路径。

本函数带有 dir_fd 参数,支持 基于目录描述符的相对路径。

如果 recursive 为真值,则模式 “" 将匹配目录中的任何文件以及零个或多个目录、子目录和符号链接。 如果模式加了一个 os.sep 或 os.altsep 则将不匹配文件。
在 3.5 版更改: 支持使用 "
” 的递归 glob。

在 3.10 版更改: 添加了 root_dir 和 dir_fd 形参。

glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False)¶
返回一个 iterator,它会产生与 glob() 相同的结果,但不会实际地同时保存它们。

引发一个 审计事件 glob.glob 附带参数 pathname, recursive。

引发一个 审计事件 glob.glob/2,附带参数 pathname, recursive, root_dir, dir_fd。

在 3.5 版更改: 支持使用 “**” 的递归 glob。

在 3.10 版更改: 添加了 root_dir 和 dir_fd 形参。

glob.escape(pathname)

转义所有特殊字符 (‘?’, ‘*’ 和 ‘[’)。 这适用于当你想要匹配可能带有特殊字符的任意字符串字面值的情况。 在 drive/UNC 共享点中的特殊字符不会被转义,例如在 Windows 上 escape(‘//?/c:/Quo vadis?.txt’) 将返回 ‘//?/c:/Quo vadis[?].txt’。

示例代码

>>> import glob
>>>
>>> glob.glob('t*')
['te2.jpg', 'te12.jpg', 'te1.jpg', 'te21.jpg', 'te.jpg']
>>> glob.glob('./t*')
['./te2.jpg', './te12.jpg', './te1.jpg', './te21.jpg', './te.jpg']
>>> glob.glob('~/test/t*')
[]
>>> glob.glob('/home/xinlin/test/t*')
['/home/xinlin/test/te2.jpg', '/home/xinlin/test/te12.jpg', '/home/xinlin/test/te1.jpg', '/home/xinlin/test/te21.jpg', '/home/xinlin/test/te.jpg']

上面的代码,用了4种不同的方式来获取当前目录下,所有t开头的pathname。我们可以看出一点规律来,glob的规则不带路径,返回的结果也不带路径;glob的规则如果带路径,不管是相对的还是绝对的,返回的结果都与之保持一样的风格;~扩展不支持,所以只有3种方式是成功的!
资料来源:glob教程

** Python的glob还支持 **规则(从3.5开始),当**规则与另一个参数recursive=True配合的时候,可以深入的路径的子目录当中去匹配:**

*/ 配合 recursive=True也不能深入到子目录当中去,而 **/ 配置 recursive=True就可以做到。有了这个工具,我们就可以非常轻松的遍历文件。下面的代码,遍历在当前路径下包含所有子目录的所有的.py文件

>>> glob.glob('*/',recursive=True)
['uploads/', 'acme-tiny/']
>>>
>>> glob.glob('**/',recursive=True)
['uploads/', 'uploads/redux/', 'uploads/2013/', 'uploads/2013/07/', 'uploads/2013/01/', 'uploads/2013/05/', 'uploads/2013/08/', 'uploads/2014/', 'uploads/2014/10/', 'uploads/2014/06/', 'uploads/2014/07/', 'uploads/2014/01/', 'uploads/2014/05/', 'uploads/2014/08/', 'uploads/2014/11/', 'uploads/2014/09/', 'uploads/2014/12/', 'uploads/2017/', 'uploads/2017/03/', 'uploads/2017/10/', 'uploads/2017/06/', 'uploads/2017/07/', 'uploads/2017/01/', 'uploads/2017/05/', 'uploads/2017/08/', 'uploads/2017/11/', 'uploads/2017/09/', 'uploads/2017/04/', 'uploads/2017/02/', 'uploads/2017/12/', 'uploads/js_composer/', 'uploads/2018/', 'uploads/2018/03/', 'uploads/2018/10/', 'uploads/2018/06/', 'uploads/2018/07/', 'uploads/2018/01/', 'uploads/2018/05/', 'uploads/2018/08/', 'uploads/2018/11/', 'uploads/2018/09/', 'uploads/2018/04/', 'uploads/2018/02/', 'uploads/2018/12/', 'uploads/2015/', 'uploads/2015/03/', 'uploads/2015/10/', 'uploads/2015/06/', 'uploads/2015/07/', 'uploads/2015/01/', 'uploads/2015/05/', 'uploads/2015/08/', 'uploads/2015/11/', 'uploads/2015/09/', 'uploads/2015/04/', 'uploads/2015/02/', 'uploads/2015/12/', 'uploads/2016/', 'uploads/2016/03/', 'uploads/2016/10/', 'uploads/2016/06/', 'uploads/2016/07/', 'uploads/2016/01/', 'uploads/2016/05/', 'uploads/2016/08/', 'uploads/2016/11/', 'uploads/2016/09/', 'uploads/2016/04/', 'uploads/2016/02/', 'uploads/2016/12/', 'uploads/masterslider/', 'uploads/2019/', 'uploads/2019/03/', 'uploads/2019/06/', 'uploads/2019/07/', 'uploads/2019/01/', 'uploads/2019/05/', 'uploads/2019/08/', 'uploads/2019/04/', 'uploads/2019/02/', 'acme-tiny/', 'acme-tiny/tests/']

glob.iglob函数

iglob函数是一个迭代器(或者叫做generator,生成器,发动机),规则和参数都与glob函数一致,不同的是,glob函数一次性的返回了所有的结果,而iglob函数是一个一个的返回结果。

>>> for pn in glob.iglob('t*'):
...     print(pn)
...
te2.jpg
te12.jpg
te1.jpg
te21.jpg
te.jpg

如果想获得文件的绝对路径,可以使用os.path.realpath函数(os.path模块的接口函数),代码如下:

>>> for pn in glob.glob('t*'):
...     print(os.path.realpath(pn))
...
/home/xinlin/test/te2.jpg
/home/xinlin/test/te12.jpg
/home/xinlin/test/te1.jpg
/home/xinlin/test/te21.jpg
/home/xinlin/test/te.jpg

glob.escape函数

escape就是“离开glob规则特别符号的原有含义”的意思。这个函数没有多大用处,它返回的是一个glob规则,将 *,?,[ 这三个特殊符号转换成可以去匹配含有这三个特殊符号字符串的glob规则:

>>> glob.escape('t*')
't[*]'
>>> glob.escape('t*[')
't[*][[]'
>>> glob.escape('t*[?')
't[*][[][?]'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值