首页Python【Python内置模块】g...

【Python内置模块】glob模块——用于文件名模式匹配

Python提供了丰富的内置模块,这些模块提供了大量的功能,涵盖了文件操作、网络编程、字符串处理、数学运算、日期和时间处理、系统编程等各个方面。

本系列将会陆续整理分享一些有趣、有用的内置模块。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/13aRH4FMdCOm5GghemfSmDQ?pwd=mnsj提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_modules





01
简介

globPython标准库中的一个模块,专门用于查找符合特定模式的路径名。它允许用户使用Unix shell规则(如*.txt)来查找符合特定模式的文件路径,尽管结果会以任意顺序返回。这是通过协同使用os.scandir()fnmatch.fnmatch()函数实现的,而不是实际调用子shell
  • 支持通配符:glob模块支持Unix shell风格的通配符,如*(匹配0个或多个字符),**(匹配所有文件、目录、子目录以及子目录中的文件),?(匹配单个字符),[seq](匹配指定范围内的字符,比如:[0-9]匹配数字,[a-z]匹配小写字母)等。
*
配0个或多个字符
**
匹配所有文件、目录、子目录以及子目录中的文件
?
匹配单个字符
[seq]
匹配指定范围内的字符,比如:[0-9]匹配数字,[a-z]匹配小写字母
  • 简单易用:glob模块的API简单直观,易于理解和使用。
  • 高效:对于大量文件的查找,glob模块提供了高效的方法,能够迅速筛选出符合条件的文件。
  • 跨平台:glob模块在不同操作系统中表现一致,无需担心平台差异带来的问题。
glob模块定义了glob.glob()glob.iglob()glob.escape()三个主要函数。
下面将使用以下的目录结构(test_dir文件夹下包含有多层子文件夹)对三个函数进行介绍:
test_dir  │  docx_1.docx  │  doc_1.doc  │  gif_1.gif  │  jpg_1.jpg  │    ├─sub_dir_1  │  │  docx_3.docx  │  │  md_3.md  │  │  png_3.png  │  │  png_4.png  │  │    │  ├─sub_dir_11  │  │      gif_3.gif  │  │      jpg_2.jpg  │  │      md_2.md  │  │        │  └─sub_dir_12  │          md_4.md  │          pptx_2.pptx  │          ppt_2.ppt  │            └─sub_dir_2      │  doc_2.doc      │  doc_3.doc      │  pptx_3.pptx      │        └─sub_dir_21              jpg_3.jpg              png_2.png              ppt_3.ppt


02
glob()方法

glob.glob()函数语法:
glob.glob(pathname, *, root_dir=None          dir_fd=Nonerecursive=False          include_hidden=False)

该函数返回一个列表,包含所有与给定模式匹配的文件路径。

其中:

  • pathname: 要匹配的路径模式(可以是绝对路径或相对路径)。可以包含通配符 *? 和 [seq] 等。

  • recursive (默认为 False): 如果 `recursive` 为 True,模式 `**` 将匹配任何文件以及零个或多个目录、子目录和指向目录的符号链接。如果模式后面跟着 `os.sep` 或 `os.altsep`,则文件不会匹配。

  • root_dir (默认为 None): 指定一个根目录,glob 将在该目录下开始搜索。如果为 None,则默认从当前工作目录开始。

  • dir_fd (默认为 None): 一个文件描述符,指向要在其下进行搜索的目录。如果为 None,则使用文件系统路径。

  • include_hidden (默认为 True): 指定是否包括隐藏文件(以点.开头的文件)在搜索结果中。

示例代码(如果要对某个路径下进行递归,一定要在后面加两个*
import glob

# 匹配test_dir文件夹下所有包含'p'的文件
glob.glob('./test_dir/*p*')

# 递归匹配test_dir文件夹下所有包含'p'的文件
glob.glob('./test_dir/**/*p*', recursive=True)

# 匹配所有以'.doc'结尾的文件
glob.glob('./test_dir/*.doc')

# 使用方括号查找以d或m开头,且以.doc结尾的文件
glob.glob('**/*.doc' , root_dir ='./test_dir' , recursive=True)

03
iglob()方法

glob.iglob()函数语法:
glob.iglob(pathname, *, root_dir=None           dir_fd=Nonerecursive=False           include_hidden=False)
该方法与glob.glob()类似,但它返回一个迭代器,而不是列表。这在处理大量匹配结果时可以节省内存,因为它不会一次性将所有结果加载到内存中。
各参数的含义与glob.glob()类似。
示例代码
import glob

# 使用glob.glob()方法将返回路径列表
# 使用方括号查找以d或m开头,且以.doc结尾的文件
path_list = glob.glob('./test_dir/**/*.doc' , recursive=True)
path_list


# 使用glob.iglob()方法将返回路径列表
# 使用方括号查找以d或m开头,且以.doc结尾的文件
file_path_iter = glob.iglob('./test_dir/**/*.doc' , recursive=True)
# 逐个打印匹配到的文件
for file_path in file_path_iter:
    print(file_path)

04
escape()和translate()方法

这两个方法使用较少,仅做了解即可。
glob.escape()函数语法:
glob.escape(pathname)
该函数用于转义路径中的所有特殊字符,使其可以安全地作为模式的一部分使用。这对于需要匹配包含特殊字符的文件名非常有用。
其中,pathname为要转义的路径名字符串。
例如,需要使用glob 来搜索一个名称包含 * 的文件,但不希望 * 被当作通配符来处理。此时就可以使用 glob.escape() 来转义这个 *
# 假设有一个文件名包含通配符 *  
filename = 'file*.txt'  
# 使用 glob.escape() 来转义文件名中的特殊字符  
escaped_filename = glob.escape(filename)  
# 现在可以使用转义后的文件名来安全地搜索文件  
matching_files = glob.glob(escaped_filename)  
glob.translate()函数语法:
glob.translate(pathname, *recursive=False               include_hidden=False, seps=None)
该函数用于将通配符模式转换为正则表达式模式,将返回一个pathname 对应的正则表达式模式的字符串。
该函数通常在想要更直接地控制搜索过程或需要更复杂的匹配逻辑时很有用。通过将 glob 模式转换为正则表达式,然后可以使用 Python 的 re 模块来进行更高级的搜索和匹配。
其中,seps参数表示一个可选的字符集,该参数用于正确处理路径分隔符。在 Unix 系统中,这通常是 ‘/’;在 Windows 系统中,这可能是 ‘/’ 或 ‘’
import re  

# 定义一个 glob 模式  
glob_pattern = '*.txt'  
# 将 glob 模式转换为正则表达式模式  
regex_pattern = glob.translate(glob_pattern)  
# 使用 re 模块来搜索匹配的文件  
for filename in os.listdir('.'):  
    if re.match(regex_pattern, filename):  
        print(filename)

更多内容可以前往官方文档查看:
https://docs.python.org/3/library/glob.html

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments