【实用 Python 库】Python glob库:轻松应对文件和目录管理

2025-12-13 0 478

导言
在Python编程中,我们经常需要处理文件和目录。为了更便捷地处理这些任务,Python提供了glob库,它允许我们根据特定模式匹配文件和目录。本篇博客将详细介绍glob库的用法,并通过实例演示它的各种功能。

什么是glob库?
glob库是Python标准库中的一个模块,它提供了一个简单而强大的方法来匹配文件和目录的路径名。通常情况下,我们在命令行中使用通配符来搜索文件,例如*.txt表示匹配所有以.txt为后缀的文件。glob库允许我们以编程的方式在Python脚本中执行类似的文件匹配操作。

glob库的主要方法是glob()函数,该函数接受一个模式字符串作为输入,并返回与该模式匹配的所有文件和目录的列表。

安装glob库
在大多数情况下,Python已经预装了glob库,因此你不需要额外安装。如果你的Python环境中没有glob库,可以使用以下命令来安装:

pip install glob2
现在让我们开始探索glob库的各种功能。

基本使用方法
导入glob库
在使用glob库之前,首先需要导入它。在Python中,我们使用import语句来导入模块:

import glob
使用通配符匹配文件
glob库使用通配符来匹配文件和目录。下面是一些常用的通配符:

*:匹配0个或多个字符。
?:匹配单个字符。
[]:匹配指定范围内的字符,如[0-9]匹配所有数字字符。
让我们来看一个例子。假设我们有一个文件夹data,其中包含以下文件:

data/
file1.txt
file2.txt
image.jpg
data.csv
现在,我们想要匹配所有以.txt为后缀的文件。我们可以使用*.txt作为模式字符串:

txt_files = glob.glob(\”data/*.txt\”)
print(txt_files)
输出:

[\’data/file1.txt\’, \’data/file2.txt\’]
正如我们所见,glob.glob()函数返回了一个列表,其中包含了所有以.txt为后缀的文件路径。

匹配特定目录
如果我们希望匹配的文件在子目录中,我们可以使用双星号**来进行递归搜索。例如,假设我们有以下文件结构:

data/
file1.txt
subdir/
file2.txt
file3.txt
我们想要匹配所有以.txt为后缀的文件,不论它们位于哪个子目录中。我们可以使用**/*.txt作为模式字符串:

txt_files_recursive = glob.glob(\”data/**/*.txt\”, recursive=True)
print(txt_files_recursive)
输出:

[\’data/file1.txt\’, \’data/subdir/file2.txt\’, \’data/subdir/file3.txt\’]
使用recursive=True参数,我们可以匹配到所有子目录中的文件。

匹配多种后缀
有时候我们需要匹配多种后缀的文件,可以使用[]来指定匹配的范围。例如,如果我们想要匹配.txt和.csv文件,我们可以使用[\”*.txt\”, \”*.csv\”]作为模式字符串:

txt_and_csv_files = glob.glob(\”data/*.[txt|csv]\”)
print(txt_and_csv_files)
输出:

[\’data/file1.txt\’, \’data/file2.txt\’, \’data/data.csv\’]
获取目录列表
除了匹配文件,glob库还可以获取目录列表。如果我们想要列出所有子目录,可以使用*/作为模式字符串:

subdirs = glob.glob(\”data/*/\”)
print(subdirs)
输出:

[\’data/subdir/\’]
使用iglob()进行迭代
对于大型目录,一次性获取所有匹配的文件列表可能会占用大量内存。在这种情况下,可以使用iglob()函数来进行迭代获取。iglob()返回一个迭代器,逐个返回匹配的文件名。

txt_files_iterator = glob.iglob(\”data/*.txt\”)
for file in txt_files_iterator:
print(file)
输出:

data/file1.txt
data/file2.txt
iglob()适用于处理大量文件时,可以节省内存开销。

过滤和排序匹配结果
在上面的例子中,我们看到glob.glob()返回匹配模式的所有文件和目录列表。然而,有时候我们可能只对某些特定的文件感兴趣,或者希望按照一定规则对匹配结果进行排序。glob库提供了一些方法来实现这些需求。

过滤匹配结果
glob库允许我们使用fnmatch模块的匹配方法来过滤匹配结果。这对于在匹配结果中执行更复杂的模式匹配非常有用。例如,假设我们只想匹配以file开头的文件:

import glob
import fnmatch

# 获取所有以\’file\’开头的文件
file_starting_with_file = fnmatch.filter(glob.glob(\”data/*\”), \”file*\”)
print(file_starting_with_file)
输出:

[\’data/file1.txt\’, \’data/file2.txt\’]
在这个例子中,我们使用fnmatch.filter()方法来从匹配结果中过滤以file开头的文件。

排序匹配结果
glob库返回的匹配结果通常是按照操作系统的文件系统规则排序的。但是,有时候我们可能需要按照自定义的方式对匹配结果进行排序。在这种情况下,我们可以使用Python的内置sorted()函数来对匹配结果进行排序。

例如,假设我们想按照文件大小对匹配的文件进行排序:

import glob
import os

# 获取匹配的文件并按照文件大小排序
matched_files = glob.glob(\”data/*.txt\”)
sorted_files_by_size = sorted(matched_files, key=os.path.getsize)
print(sorted_files_by_size)
输出:

[\’data/file1.txt\’, \’data/file2.txt\’]
在这个例子中,我们使用os.path.getsize()函数作为sorted()函数的key参数,从而按照文件大小对匹配结果进行排序。

自定义匹配规则
glob库允许我们使用自定义函数来对匹配结果进行过滤和排序。例如,假设我们想要匹配所有以奇数数字结尾的文件,并按照数字大小进行排序:

import glob

# 自定义过滤函数
def custom_filter(file_path):
filename = file_path.split(\”/\”)[-1]
last_char = filename[-5] # 获取倒数第5个字符,即文件名中的最后一个数字
return last_char.isdigit() and int(last_char) % 2 == 1

# 获取匹配的文件并按照自定义规则排序
matched_files = glob.glob(\”data/*\”)
filtered_and_sorted_files = sorted(filter(custom_filter, matched_files))
print(filtered_and_sorted_files)
输出:

[\’data/file1.txt\’]
在这个例子中,我们定义了一个custom_filter()函数来过滤以奇数数字结尾的文件,并使用sorted()函数按照自定义规则进行排序。

遍历子目录中的文件
前面我们介绍了使用**来进行递归搜索,但如果你只希望遍历子目录中的文件而不进一步进入子目录,可以使用glob.glob()结合os.path.join()来实现。

例如,假设我们有以下文件结构:

data/
file1.txt
subdir1/
file2.txt
file3.txt
subdir2/
file4.txt
现在我们只想遍历data目录及其直接子目录中的所有文件:

import glob
import os

def list_files_in_directory(directory):
files = []
for file_path in glob.glob(os.path.join(directory, \”*\”)):
if os.path.isfile(file_path):
files.append(file_path)
return files

directory_path = \”data\”
files_in_directory = list_files_in_directory(directory_path)
print(files_in_directory)
输出:

[\’data/file1.txt\’, \’data/subdir1/file2.txt\’, \’data/subdir1/file3.txt\’, \’data/subdir2/file4.txt\’]
在这个例子中,我们定义了一个list_files_in_directory()函数,该函数遍历指定目录中的文件,并忽略子目录。使用os.path.join()函数来构建文件路径,确保可以正确处理不同操作系统下的路径分隔符。

使用glob库进行文件处理
glob库不仅仅用于匹配和获取文件列表,还可以方便地进行文件处理。我们可以将glob库与其他Python库(例如os、shutil等)结合使用,来执行各种文件操作。

复制文件
假设我们想将所有以.txt为后缀的文件复制到另一个目录中,我们可以使用shutil库来实现:

import glob
import shutil

source_directory = \”data\”
destination_directory = \”backup\”

txt_files = glob.glob(os.path.join(source_directory, \”*.txt\”))
for txt_file in txt_files:
shutil.copy(txt_file, destination_directory)
在这个例子中,我们首先使用glob库来获取所有以.txt为后缀的文件列表,然后使用shutil.copy()函数将这些文件复制到backup目录中。

删除文件
如果我们希望删除所有以.csv为后缀的文件,可以使用os.remove()函数来实现:

import glob

csv_files = glob.glob(\”data/*.csv\”)
for csv_file in csv_files:
os.remove(csv_file)
在这个例子中,我们使用glob库来获取所有以.csv为后缀的文件列表,然后使用os.remove()函数来删除这些文件。

批量重命名文件
glob库与字符串处理和os.rename()函数结合使用,可以批量重命名文件。假设我们有一系列文件名格式为file_<num>.txt(例如file_1.txt、file_2.txt等),现在我们希望将它们重命名为data_<num>.txt:

import glob
import os

files_to_rename = glob.glob(\”data/file_*.txt\”)
for old_file_path in files_to_rename:
new_file_path = old_file_path.replace(\”file_\”, \”data_\”)
os.rename(old_file_path, new_file_path)
在这个例子中,我们首先使用glob库获取所有需要重命名的文件,然后使用字符串的replace()方法将file_替换为data_,最后使用os.rename()函数进行重命名。

使用glob库的注意事项
虽然glob库是一个功能强大的工具,但在使用时还有一些注意事项:

在使用glob库时,应该谨慎处理用户提供的输入,以避免路径遍历攻击(Path Traversal Attack)。
使用glob库时要注意平台兼容性,特别是在处理路径分隔符时。建议使用os.path.join()来构建文件路径,以确保在不同操作系统上都能正确运行。
对于大型目录和大量文件的处理,使用iglob()或者配合生成器(generator)等方法,可以避免不必要的内存开销。
结语
glob库提供了一个简单而强大的方法来管理文件和目录,让我们可以轻松地在Python脚本中处理文件。通过掌握glob库的使用,我们可以更高效地编写Python程序,并在实际项目中应用它们。

希望本篇博客能帮助你理解和学会使用glob库,让你在文件处理和目录管理中能够游刃有余。继续探索和实践,你将在Python编程中收获更多的乐趣和成就!
————————————————
版权声明:本文为CSDN博主「繁依Fanyi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21484461/article/details/131908308

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 【实用 Python 库】Python glob库:轻松应对文件和目录管理 https://www.zuozi.net/36458.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务