浅析python标准库中的glob

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中处理文件操作。

后端开发标签