python standard library glob

python 标准库之 glob

在严寒的冬季,温暖人的只有笑脸了吧。

今天继续给大家介绍python标准库 glob

参考文档

glob 模块可根据 Unix 终端所用规则找出所有匹配特定模式的路径名,但会按不确定的顺序返回结果。支持查找文件只用到三个匹配符:’*’, “?”, “[ ]”,不包括波浪线~,因为这个符号在linux代表当前用户的home目录。

对于波浪号和终端变量扩展,请使用 os.path.expanduser()os.path.expandvars())。

根据阅读代码发现,这个底层使用cpython实现, 有兴趣的童鞋可以移步到源代码: Lib/glob.py

相对于高级面向对象路径查找模块pathlib ,glob更偏向底层实现。

函数

  • glob.glob(pathname, *, recursive=False)

    返回匹配 pathname 的可能为空的路径名列表,其中的元素必须为包含一个路径信息的字符串。 pathname 可以是绝对路径 (如 /usr/src/Python-1.5/Makefile) 或相对路径 (如 ../../Tools/*/*.gif),并且可包含 shell 风格的通配符。 结果也将包含无效的符号链接 (与在 shell 中一致)。 结果是否排序取决于具体文件系统。

    如果 recursive 为真值,则模式 “**“ 将匹配目录中的任何文件以及零个或多个目录、子目录和符号链接。 如果模式加了一个 os.sepos.altsep 则将不匹配文件。

    备注:在一个较大的目录树中使用 “**“ 模式可能会消耗非常多的时间。 3.5 版更改: 支持使用 “**“ 的递归 glob

  • glob.iglob(pathname, *, recursive=False)

    返回一个 iterator,它会产生与 glob() 相同的结果,但不会实际地同时保存它们。

  • glob.escape(pathname)

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

实例

1
2
3
4
5
6
7
8
9
10
11
12
#例如,考虑一个包含以下内容的目录:文件 1.gif, 2.txt, card.gif 以及一个子目录 sub 其中只包含一个文件 3.txt. glob() 将产生如下结果。 请注意路径的任何开头部分都将被保留。

>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']

如果目录包含以 . 打头的文件,它们默认将不会被匹配。 例如,考虑一个包含 card.gif.card.gif 的目录:

1
2
3
4
5
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

补充内容

”*”匹配任意0个或多个字符;”?”匹配任意单个字符;”[ ]”匹配指定范围内的字符,如:[0-9]匹配数字。

如下图所示的文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import glob
# 返回上一级所有目录
print(glob.glob(r"../*"))
# 返回上本级所有目录
print(glob.glob(r"./*"))
# 本级所有文件
print(glob.glob(r"./*.*"))
# 本级所有.py文件
print(glob.glob('./*.py'))
#两级目录所有的.py文件
print(glob.glob('./*/*.py'))
# c盘所有文件
print(glob.glob(r'c:/*'))
#C盘所有包含pr/po/br/bo的目录
print(glob.glob('C:/*[PB][RO]*'))
#C盘所有包含P_o的目录
print(glob.glob('C:/*P?O*'))
#C盘两级目录所有的.txt文件
print(glob.glob('C:/*/*.txt'))

显示内容如下:

1
2
3
4
5
['..\\class_demo.py', '..\\excel', '..\\flask_test', '..\\glob', '..\\image', '..\\mymodule', '..\\numpy', '..\\opencv', '..\\opencv_demo', '..\\othermodule', '..\\ppt', '..\\python_enuerate.py', '..\\python速成', '..\\selenium_test', '..\\交换算法.py', '..\\爬虫']
['.\\app', '.\\config', '.\\data', '.\\glob_demo.py', '.\\other.py', '.\\readme.md']
['.\\glob_demo.py', '.\\other.py', '.\\readme.md']
['.\\glob_demo.py', '.\\other.py']
['.\\app\\__init__.py', '.\\config\\config.py']

其他

阅读源码中发现

1
2
3
4
5
6
7
8
"""Filename globbing utility."""

import os
import re
import fnmatch
import sys

__all__ = ["glob", "iglob", "escape"]

顺便把__all__用法整理下,算是查漏补缺,

__all__

问题描述:

在研读pythonmodel源码时,会看到一些.py文件或者init.py中会使用all。对于all具体所其的作用是什么?在此对查取结果进行总结下。2.总结(1)在init.py文件中表示形式:all=[“module_a”,”module_b”]在使用frompackage_nameimport时,表示import该package中的两个module及两个module相关的类、方

表示形式: __all__=["class_name","function_name"]

在使用 from module_name import * 时,表示import 该module中的all中所列出的。

使用注意事项:

(1) 在普通的*.py中, 使用all 时,可以使用all列出的 类、函数、变量等,不使用all时会使用module中的所有不以下划线开头的成员。

(2)all只能影响到 from import * 这种import 方式, 对于from import 的 import 方式没有影响。

(3) all 的数据类型:List or Tuple

关联的模块

模块 fnmatch

Shell 风格文件名(而非路径)扩展

坚持原创技术分享,您的支持将鼓励我继续创作!