1. 什么是glob?
Glob模块是python中用于查找符合特定规则的文件路径名的模块。Glob是“Global”的缩写,在Unix/Linux中指的是通配符扩展,例如:*.txt(表示所有后缀为.txt的文件)。
2. Glob的基本用法
2.1 匹配单个字符
glob模块带有两个主要的功能:搜索和查找。当我们想要Search在文件系统中找到相应的文件时,我们可以使用它。可以使用glob.glob()查找所有与给定模式匹配的路径列表。
我们可以使用问号”?”来匹配单个字符。例如,如果我们想要在当前目录中查找所有前两个字母为‘fi’,后两个字母为‘le’,中间是任意一个字符的所有文件,则可以通过如下代码实现:
import glob
files = glob.glob('fi?le*')
print(files)
输出结果:
其中:
'fi?le':代表第三个字母必须匹配一个字符。
'*':代表任意数量字符。
2.2 匹配多个字符
我们可以使用方括号”[]”匹配多个字符。例如,如果我们想要查找以a,b或c开头 but end with xyz的所有文件,则可以通过如下代码实现:
import glob
files = glob.glob('[abc]*xyz')
print(files)
输出结果:
其中:
'[abc]':代表以a,b或c中的任何一个字符开头
'*':代表任意数量字符。
'xyz':代表以xyz结尾。
2.3 匹配指定范围
我们可以使用大括号“{}”来指定一个或多个字符串。 通过将其与方括号结合使用,我们可以在指定匹配字符范围的同时,指定一个或多个字符串。例如,如果我们要查找所有.txt和.doc文件,则可以使用如下代码:
import glob
files = glob.glob('*.{txt,doc}')
print(files)
输出结果:
其中:
'*':代表任意数量字符。
'{txt,doc}':代表其中一个文件类型,用逗号分隔。
2.4 匹配子目录
如果要查找子目录中的文件,则可以将通配符交给glob.glob()。例如,如果要查找D盘根目录下包含文本字符的文件,则可以使用如下代码:
import glob
files = glob.glob('D:**/*txt', recursive=True)
print(files)
输出结果:
其中:
**:代表任意数量级的目录
'/':代表目录分隔符。
'*':代表任意数量字符。
2.5 搜索目录结构
除了使用glob.glob()查找文件夹外,还可以使用glob.os.walk()在目录结构中执行递归查找。 此方法返回一种三元组,其中包括当前文件夹,包含的子文件夹和包含在其中的文件列表。
import glob, os
for dirpath, dirnames, filenames in os.walk('C:/Users/Administrator/Downloads'):
for filename in [f for f in filenames if f.endswith('.txt')]:
print(os.path.join(dirpath, filename))
输出结果:
其中:
os.walk():此方法返回三个值:当前文件夹路径、包含在当前文件夹中的目录、包含在当前文件夹中的文件名。
除此之外,glob模块还支持许多其他功能,例如:
使用glob.escape()转义模式中的特殊字符以便不被解释。
使用glob.has_magic()测试给定的模式字符串是否包含特殊字符。
支持使用用户定义的匹配函数(默认情况下使用标准的意向匹配逻辑)。
3. Glob实例应用
3.1 查找最新的文件
有时候,我们需要从文件夹中查找最新的文件,我们可以使用Glob组合日期过滤器查找最新的文件。 如下所示:
import glob, os
directory = 'C:/Users/Administrator/Downloads'
extensions = ('*.csv', '*.xlsx')
files = []
for ext in extensions:
files.extend(glob.glob(os.path.join(directory, ext)))
latest_file = max(files, key=os.path.getctime)
print(latest_file)
输出结果:
其中:
os.path.join():使用给定的参数拼接为一个完整路径。
os.path.getctime():返回文件’path’最后修改的时间。
max():返回一个可迭代的最大元素。.
3.2 处理异常情况
有些时候,当我们只想遍历文件夹时,会遇到没有目标文件或文件夹的情况。这样会导致程序出现错误,我们可以使用glob.glob()在代码中处理这种异常情况。如下所示:
directory = 'c:/Downloads'
if not os.path.exists(directory):
os.makedirs(directory)
print('Created directory to save files...')
else:
print('Directory exists!')
输出结果:
其中:
os.path.exists():如果路径存在,则返回True,否则返回False。
os.makedirs():如果目录已存在,则不创建目录。
3.3 查找空目录
有时候,我们需要查找空文件夹。我们可以使用os模块和Glob模块在Python中查找目录中的空目录。如下所示:
import os, glob
path = "C:/Users/Administrator/Desktop"
for dir_path, dir_names, file_names in os.walk(path):
if not dir_names and not file_names:
print('Empty directory:', dir_path)
输出结果:
其中:
os.walk():该方法返回三个元素:文件夹路径、文件夹名称(如果有)和文件名称(如果有)。
4. 总结
在本篇文章中,我们详细讲述了Python glob模块的基本用法,并通过代码示例展示了如何使用glob模块在文件夹中搜索和查找特定文件类型或文件名。也讲解了如何使用glob和os模块查找最新的文件和如何处理异常情况等。这些功能都是非常实用的,有助于更轻松地在Python中处理文件操作。