使用glob模块能够快速查找我们想要的目录和文件。当然OS也可以完成这样的操作。
❝*:匹配0个或多个字符;
**:匹配所有文件、目录、子目录和子目录里的文件(3.5版本新增);
?:代匹配一个字符;
[]:匹配指定范围内的字符,如[0-9]匹配数字,[a-z]匹配小写字母;
❞
主要函数
❝glob.glob():返回符合匹配条件的所有文件的路径;
glob.iglob():返回一个迭代器对象,需要循环遍历获取每个元素,得到的也是符合匹配条件的所有文件的路径;
glob.escape():escape可以忽略所有的特殊字符,就是星号、问号、中括号,用处不大; recursive=False:代表递归调用,与特殊通配符“**”一同使用,默认为False,False表示不递归调用,True表示递归调用;
❞
例子
import glob
print(glob.glob('*')) # 匹配当前路径下所有的文件及文件夹,并返回列表
print(glob.glob('*.*')) # 匹配当前路径下所有带.的文件
print(glob.glob('*.py')) # 匹配当前路径下所有的.py文件
print(glob.glob('hh?')) # 匹配hh开头并后面紧跟一个字符的文件夹
print(glob.glob('hh1[2]')) # 匹配hh1开头且后面紧跟数字2的文件夹
['11.tml', 'config,toml', 'config.ini', 'config.json', 'config.yaml', 'config1.csv', 'csv_read.py', 'glob_.py', 'hh12', 'hh_', 'log.txt', 'test_one.py', 'toml_read.py', 'Yaml_read.py', '__pycache__', '作用域.py', '闭包.py']
['11.tml', 'config.ini', 'config.json', 'config.yaml', 'config1.csv', 'csv_read.py', 'glob_.py', 'log.txt', 'test_one.py', 'toml_read.py', 'Yaml_read.py', '作用域.py', '闭包.py']
['csv_read.py', 'glob_.py', 'test_one.py', 'toml_read.py', 'Yaml_read.py', '作用域.py', '闭包.py']
['hh_']
['hh12']
当然也可以是绝对路径亦或者自己写定的先对路径:
import glob
print(glob.glob('../lib/*'))
"""
['../lib\\chromedriver.exe', '../lib\\geckodriver.exe', '../lib\\IEDriverServer.exe']
"""
recursive参数
import glob
print(glob.glob("**"))
print(glob.glob("**",recursive=True))
"""
['11.tml', 'config,toml', 'config.ini', 'config.json', 'config.yaml', 'config1.csv', 'csv_read.py', 'glob_.py', 'hh12', 'hh_', 'log.txt', 'test_one.py', 'toml_read.py', 'Yaml_read.py', '__pycache__', '作用域.py', '闭包.py']
['11.tml', 'config,toml', 'config.ini', 'config.json', 'config.yaml', 'config1.csv', 'csv_read.py', 'glob_.py', 'hh12', 'hh_', 'log.txt', 'test_one.py', 'toml_read.py', 'Yaml_read.py', '__pycache__', '__pycache__\\test_one.cpython-39-pytest-7.1.3.pyc', '__pycache__\\toml_read.cpython-39.pyc', '作用域.py', '闭包.py']
"""
❝总体上没有太大的区别,细微的区别体现!**搭配recursive且为True的时候可以将子文件夹中的文件夹中的文件都匹配出来。
❞
与OS模块比较
import os
for dirpath,dirname,filename in os.walk('.'):
for name in filename:
if 'con' in name:
filepath = os.path.join(dirpath,name)
print(filepath)
"""
.\config,toml
.\config.ini
.\config.json
.\config.yaml
.\config1.csv
"""
import glob
for i in glob.glob(r'.\con*',recursive=True):
print(i)
"""
.\config,toml
.\config.ini
.\config.json
.\config.yaml
.\config1.csv
"""
至于优劣,此处不做评价,此处就代码量上说,glob是比较简短的。区别就是路径上的一点点小区别,无伤大雅。
iglob
import glob
paths = glob.iglob("*")
print(paths)
for j in paths:
print(j)
warning 它返回一个生成器,所以需要使用循环进行取值操作。其作用与glob.glob类似。