使用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类似。