Python实现任意文件查找工具(两种方式)
摘要
在日常的开发和运维工作中,经常需要查找特定类型的文件或带有特定模式的文件。使用命令行工具如find
、grep
等可以满足需求,但有时我们希望用编程语言来实现更加灵活和可定制化的解决方案。本文将介绍如何使用Python编写一个简单的文件查找工具,支持通配符匹配,并且可以在指定目录下递归查找文件。我们将提供两种不同的实现方式:一种基于os.walk()
和fnmatch
,另一种基于glob
模块。
环境准备
确保你已经安装了Python 3.x版本。如果你还没有安装,请访问Python官网下载并安装最新稳定版。
实现方式一:使用os.walk()
和fnmatch
实现思路
- 导入必要的库:我们将使用
os
模块来遍历目录结构,使用fnmatch
模块来进行通配符匹配。 - 定义函数:创建一个名为
find_files_with_os_walk
的函数,该函数接收两个参数:一个是目标目录路径,另一个是包含通配符的文件名模式。 - 递归遍历目录:通过
os.walk()
方法遍历给定目录及其子目录。 - 匹配文件名:对于每个文件,使用
fnmatch.fnmatch()
检查其名称是否符合提供的模式。 - 返回结果:将所有符合条件的文件路径存储在一个列表中,并最终返回该列表。
代码实现
import os
import fnmatch
def find_files_with_os_walk(directory, pattern):
"""
在指定目录及其子目录中查找符合给定模式的文件。
参数:
directory (str): 要搜索的根目录路径。
pattern (str): 文件名模式,支持通配符 * 和 ?。
返回:
list: 符合条件的文件路径列表。
"""
matched_files = []
# 遍历目录树
for root, dirs, files in os.walk(directory):
for basename in files:
if fnmatch.fnmatch(basename, pattern):
filename = os.path.join(root, basename)
matched_files.append(filename)
return matched_files
# 示例用法
if __name__ == "__main__":
import sys
if len(sys.argv) != 3:
print("Usage: python find_files.py <directory> <pattern>")
sys.exit(1)
directory = sys.argv[1]
pattern = sys.argv[2]
results = find_files_with_os_walk(directory, pattern)
for result in results:
print(f'查找的文件名:{result.split(os.sep)[-1]}', f'完整路径:{result}')
(.venv) (base) liuxiaowei@localhost 查找文件的方式 % python 查找文件-方法1.py -h
Usage: python find_files.py <directory> <pattern>
(.venv) (base) liuxiaowei@localhost 查找文件的方式 % python 查找文件-方法1.py '/Users/liuxiaowei/Desktop' '护*.*'
查找的文件名:护理病案.pdf 完整路径:/Users/liuxiaowei/Desktop/护理病案.pdf
查找的文件名:护理查房.pdf 完整路径:/Users/liuxiaowei/Desktop/护理查房.pdf
实现方式二:使用glob
模块
实现思路
- 导入必要的库:我们将使用
glob
模块,它可以直接处理通配符模式,简化了文件查找过程。 - 定义函数:创建一个名为
find_files_with_glob
的函数,该函数接收两个参数:一个是目标目录路径,另一个是包含通配符的文件名模式。 - 生成文件路径:通过
glob.glob()
方法生成符合条件的文件路径列表。 - 返回结果:直接返回生成的文件路径列表。
代码实现
import glob
import os
def find_files_with_glob(directory, pattern):
"""
在指定目录及其子目录中查找符合给定模式的文件。
参数:
directory (str): 要搜索的根目录路径。
pattern (str): 文件名模式,支持通配符 * 和 ?。
返回:
list: 符合条件的文件路径列表。
"""
# 将目录路径与模式组合成完整的路径模式
full_pattern = os.path.join(directory, "**", pattern)
# 使用glob模块进行查找
matched_files = glob.glob(full_pattern, recursive=True)
return matched_files
# 示例用法
if __name__ == "__main__":
import sys
if len(sys.argv) != 3:
print("Usage: python find_files.py <directory> <pattern>")
sys.exit(1)
directory = sys.argv[1]
pattern = sys.argv[2]
results = find_files_with_glob(directory, pattern)
for result in results:
print(f'查找的文件名:{result.split(os.sep)[-1]}', f'完整路径:{result}')
(.venv) (base) liuxiaowei@localhost 查找文件的方式 % python 查找文件-方法2.py '/Users/liuxiaowei/Desktop' '护*.*'
查找的文件名:护理病案.pdf 完整路径:/Users/liuxiaowei/Desktop/护理病案.pdf
查找的文件名:护理查房.pdf 完整路径:/Users/liuxiaowei/Desktop/护理查房.pdf
使用说明
保存上述代码为find_files.py
后,在命令行中运行此脚本时需要提供两个参数:一个是想要搜索的目标目录路径,另一个是要查找的文件名模式(例如*.txt
)。例如:
$ python find_files.py /path/to/search "*.log"
这将在/path/to/search
目录及其所有子目录中查找所有扩展名为.log
的文件,并打印出它们的完整路径。
总结
通过这篇文章,我们学习了两种使用Python内置库快速构建带通配符的文件查找工具的方法:
- 使用
os.walk()
和fnmatch
:适用于需要更细粒度控制的情况,如过滤文件类型、排除某些目录等。 - 使用
glob
模块:简单直观,适合大多数常规文件查找任务。
这两种方法不仅简单易懂,而且非常灵活,可以根据实际需求进一步扩展功能,比如添加多线程支持以提高效率,或者集成到更大的应用程序中作为一部分功能。希望这篇技术文章对你有所帮助!
欢迎点赞、关注、转发、收藏!!!
作者简介
吉林白城 70后高级网络安全工程师,双专业、双工学学士学位。阿里云乘风者计划专家博主、51CTO网站合作博主。拥有超过20年的IT行业经验,专注于网络安全、人工智能、运维、数据分析及办公自动化。持有CISE和CISP-PTE认证,在安全架构设计与实施方面经验丰富。擅长利用Python解决复杂问题,推动自动化和效率提升。热衷于技术分享,帮助更多人掌握先进技术和方法。
如有网络安全、人工智能、训练应用大模型等方面业务需求。欢迎联系!
联系方式:
- Email: 1134593154@qq.com