文章目录
- glob模块介绍
- 搜索当前目录下的所有 .txt 文件:
- 搜索特定目录下的所有 .py 文件:
- 搜索子目录中的文件:
- 使用通配符:
- glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
- glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
- glob.escape(pathname)
- glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)
glob模块介绍
glob 是 Python 中的一个标准库模块,用于在目录中使用通配符搜索创建文件列表。这个模块提供了一个在目录中使用通配符搜索文件名的函数,返回匹配所有路径名的列表。它类似于 Unix shell 中的功能。
这里有一些使用 glob 模块的基本示例:
导入模块:
import glob
搜索当前目录下的所有 .txt 文件:
txt_files = glob.glob('*.txt') print(txt_files)
搜索特定目录下的所有 .py 文件:
py_files = glob.glob('/path/to/directory/*.py') print(py_files)
搜索子目录中的文件:
使用 ** 来递归搜索子目录。注意,这个功能在 Python 3.5+ 中可用。
all_py_files = glob.glob('/path/to/directory/**/*.py', recursive=True) print(all_py_files)
使用通配符:
你可以使用 ? 来匹配单个字符,和 * 来匹配任意字符序列(包括空序列)。
# 搜索所有以 'a' 开头,以 '.txt' 结尾的文件 a_txt_files = glob.glob('a*.txt') print(a_txt_files)
glob 模块在处理大量文件或需要递归搜索子目录的情况时特别有用。不过,它并不提供对文件内容的直接操作,只是返回匹配的文件路径列表。对于文件内容的处理,你通常需要结合其他模块,如 os 或文件操作函数(如 open())。
glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
glob.glob() 函数在 Python 中用于路径名模式匹配,它基于 Unix shell 风格的通配符来搜索符合特定模式的文件名。glob 模块提供的 glob() 函数接受多个参数,用于控制搜索的行为。以下是对 glob.glob() 函数参数的详细解释:
参数:
- pathname:要搜索的模式字符串。模式可以包含通配符 *、? 和 [seq],以及字符类(如 [a-z])和 ! 来排除字符。
- root_dir(Python 3.9+ 新增):可选参数,用于指定搜索的根目录。如果提供了 root_dir,则 pathname 相对于该目录进行解释。这有助于防止路径遍历攻击。
- dir_fd(Python 3.3+ 新增):一个可选的文件描述符,它应该引用一个目录。如果提供了此参数,则搜索将在该目录中进行,而不是在当前工作目录中。这允许在不改变当前工作目录的情况下搜索目录。
- recursive(Python 3.5+ 新增):一个布尔值,如果为 True,则模式会递归地应用于目录及其所有子目录。这允许你使用 ** 通配符来匹配任意数量的目录。
- include_hidden(Python 3.10+ 新增):一个布尔值,如果为 True,则搜索将包括隐藏文件(在 Unix-like 系统中,通常以点(.)开头的文件)。默认情况下,隐藏文件会被排除。
返回值:
返回一个字符串列表,包含所有匹配 pathname 模式的路径名。
示例:
基本使用:
import glob # 搜索当前目录下所有的 .txt 文件 txt_files = glob.glob('*.txt') print(txt_files)
使用递归搜索:
# 搜索当前目录及其子目录下所有的 .py 文件 py_files = glob.glob('**/*.py', recursive=True) print(py_files)
使用 root_dir 参数:
# 搜索指定目录下的所有 .csv 文件,防止路径遍历攻击 csv_files = glob.glob('*.csv', root_dir='/path/to/secure/directory') print(csv_files)
glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
glob.iglob() 函数与 glob.glob() 函数非常相似,它们都用于在文件系统中搜索匹配特定模式的文件路径。主要区别在于 glob.iglob() 返回一个迭代器,而不是一个包含所有匹配路径的列表。这意味着 iglob() 在处理大量文件或需要逐步处理匹配路径时可能更加高效,因为它不需要一次性将所有匹配项加载到内存中。
下面是 glob.iglob() 函数的参数解释:
参数:
- pathname:要搜索的模式字符串。与 glob.glob() 中的 pathname 参数相同,可以包含通配符。
- root_dir(Python 3.9+ 新增):指定搜索的根目录。如果提供了 root_dir,则 pathname 相对于该目录进行解释。这有助于防止路径遍历攻击。
- dir_fd(Python 3.3+ 新增):一个可选的文件描述符,引用一个目录。搜索将在该目录中进行,而不是在当前工作目录中。
- recursive(Python 3.5+ 新增):一个布尔值,如果为 True,则模式会递归地应用于目录及其所有子目录。
- include_hidden(Python 3.10+ 新增):一个布尔值,如果为 True,则搜索将包括隐藏文件。
返回值:
返回一个迭代器,产生所有匹配 pathname 模式的路径名。你可以使用 for 循环来遍历这些路径。
示例:
使用 iglob() 逐步处理匹配路径:
import glob
# 搜索当前目录及其子目录下所有的 .py 文件 for py_file in glob.iglob('**/*.py', recursive=True): print(py_file) # 在这里可以对每个 py_file 进行处理,而不是一次性处理所有文件
在这个例子中,iglob() 返回一个迭代器,我们使用 for 循环来遍历每个匹配 .py 文件的路径,并逐个进行处理。这样,我们不需要一次性将所有匹配的文件路径加载到内存中,这对于处理大量文件时非常有用。
glob.escape(pathname)
Python glob 模块中的一个函数,它用于转义 pathname 中的所有特殊字符,这样 pathname 就可以被安全地用作 glob 函数的参数,而不会受到通配符(如 * 和 ?)的影响。
参数:
- pathname:要转义的路径名字符串。
返回值:
返回一个字符串,其中 pathname 中的所有特殊字符都被转义了。
示例:
假设你有一个文件名,它包含一个 *,你想用 glob 来搜索这个文件,但你不希望 * 被当作通配符来处理。你可以使用 glob.escape() 来转义这个 *:
import glob
# 假设有一个文件名包含通配符 *
filename = 'file*.txt'
# 使用 glob.escape() 来转义文件名中的特殊字符
escaped_filename = glob.escape(filename)
# 现在可以使用转义后的文件名来安全地搜索文件
matching_files = glob.glob(escaped_filename)
print(matching_files)
在这个例子中,glob.escape(filename) 会返回类似 ‘file*.txt’ 的字符串(实际返回的字符串取决于平台,可能包含额外的转义字符),这样当你使用 glob.glob(escaped_filename) 时,* 就不会被当作通配符来匹配任意字符序列,而是会被当作文件名中的普通字符来搜索。
这个函数在处理用户输入或不确定是否包含通配符的文件名时特别有用,因为它可以确保 glob 函数按照预期的方式工作。
glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)
Python glob 模块中的一个函数,用于将通配符模式转换为正则表达式模式。这通常在你想要更直接地控制搜索过程或需要更复杂的匹配逻辑时很有用。通过将 glob 模式转换为正则表达式,你可以利用 Python 的 re 模块来进行更高级的搜索和匹配。
参数:
- pathname:包含通配符的原始 glob 模式字符串。
- recursive(Python 3.5+ 新增):一个布尔值,如果为 True,则模式会递归地应用于目录及其所有子目录。这主要用于转换递归搜索的模式,如 **/*.py。
- include_hidden(Python 3.10+ 新增):一个布尔值,如果为 True,则转换后的正则表达式将匹配隐藏文件(在 Unix-like 系统中,通常以点(.)开头的文件)。
- seps(Python 3.11+ 新增):一个可选的字符集,它应该包含用于分隔路径组件的字符。在 Unix 系统中,这通常是 ‘/’;在 Windows 系统中,这可能是 ‘/’ 或 ‘\’。这个参数用于正确处理路径分隔符。
返回值:
返回一个字符串,它是 pathname 对应的正则表达式模式。
示例:
import glob
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)
在这个例子中,glob.translate(glob_pattern) 将 *.txt 这个 glob 模式转换为一个正则表达式模式,然后我们使用 re.match() 来检查当前目录下的每个文件名是否匹配这个正则表达式。
需要注意的是,虽然 glob.translate() 提供了将 glob 模式转换为正则表达式的能力,但通常情况下,直接使用 glob.glob() 或 glob.iglob() 会更加简单和方便,除非你确实需要正则表达式的复杂匹配能力。