glob模块使用教程

2019年8月18日 / 37次阅读 / Last Modified 2019年8月18日
遍历文件

glob是一个古老的UNIX程序,它用来匹配路径文件名(pathname模式匹配),现在在Linux Shell使用和编程方面,glob还在被广泛使用。Python自带一个glob模块,让我们可以在Python编码时,也使用glob的功能。

本文介绍在Python中如何使用glob模块,因此请同学们先自行学习glob模式匹配的规则

glob.glob函数

此函数返回一个符合glob匹配的pathname的list,返回结果有可能是空,还掉的符号链接文件也可能会包含在返回结果中(它也是个文件呀)。

>>> 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种方式是成功的!

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

>>> glob.glob('**')
['uploads', 'walktree.py', '123.txt', 'te2.jpg', 'uploads.bk', 'te12.jpg', 'abc.txt', 'udpserver.py', 'udpclient.py', 'auto_mysql_dump.py', 'te1.jpg', 'te21.jpg', 'acme-tiny', 'te.jpg']
>>>
>>> glob.glob('*')
['uploads', 'walktree.py', '123.txt', 'te2.jpg', 'uploads.bk', 'te12.jpg', 'abc.txt', 'udpserver.py', 'udpclient.py', 'auto_mysql_dump.py', 'te1.jpg', 'te21.jpg', 'acme-tiny', 'te.jpg']
>>>
>>> glob.glob('**/')  # get subdirectories
['uploads/', 'uploads.bk/', 'acme-tiny/']
>>>
>>> glob.glob('*/')  # get subdirectories
['uploads/', 'uploads.bk/', 'acme-tiny/']

上面这段测试代码,还看不出**和*的区别。请继续看下面的代码:

>>> 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/']

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

>>> glob.glob('**/*.py', recursive=True)
['walktree.py', 'udpserver.py', 'udpclient.py', 'auto_mysql_dump.py', 'acme-tiny/acme_tiny.py', 'acme-tiny/setup.py', 'acme-tiny/tests/server.py', 'acme-tiny/tests/__init__.py', 'acme-tiny/tests/monkey.py', 'acme-tiny/tests/test_install.py', 'acme-tiny/tests/test_module.py']

哪种遍历文件的方法好,要根据需求来,本站还有两篇文章,分别介绍了另外两种不同的遍历方法,供各位参考:Python递归遍历os.walk函数遍历

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
>>> for pn in glob.iglob('**/*.py',recursive=True):
...     print(pn)
...
walktree.py
udpserver.py
udpclient.py
auto_mysql_dump.py
acme-tiny/acme_tiny.py
acme-tiny/setup.py
acme-tiny/tests/server.py
acme-tiny/tests/__init__.py
acme-tiny/tests/monkey.py
acme-tiny/tests/test_install.py
acme-tiny/tests/test_module.py

如果想获得文件的绝对路径,可以使用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[*][[][?]'

如果是学习过glob规则的同学,自己都可以直接写出escape函数的返回值。

Python的glob模块很小,就上面这三个函数,希望本文能对您有所帮助。

-- EOF --

本文链接:https://www.pynote.net/archives/852

留言区

《glob模块使用教程》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    在庞大的目录结构中使用glob模块遍历文件,为了减少内存的消耗,只能使用iglob这个成员函数。 [回复]


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top