glob模块使用
glob模块使用
glob是一个古老的UNIX程序,它用来匹配路径文件名(pathname模式匹配),现在在Linux Shell使用和编程方面,glob还在被广泛使用。Python自带一个glob模块,让我们可以在Python编码时,也使用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/']
*/ 配合 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']
glob.iglob函数
iglob函数是一个迭代器(或者叫做generator,生成器,发动机),规则和参数都与glob函数一致,不同的是,glob函数一次性的返回了所有的结果,而iglob函数是一个一个的返回结果。
glob.escape函数
escape就是“离开glob规则特别符号的原有含义”的意思。这个函数没有多大用处,它返回的是一个glob规则,将 *,?,[ 这三个特殊符号转换成可以去匹配含有这三个特殊符号字符串的glob规则:
>>> glob.escape('t*')
't[*]'
>>> glob.escape('t*[')
't[*][[]'
>>> glob.escape('t*[?')
't[*][[][?]'