Python实现任意文件查找工具(两种方式)

news2025/1/10 4:27:15

Python实现任意文件查找工具(两种方式)

摘要

在日常的开发和运维工作中,经常需要查找特定类型的文件或带有特定模式的文件。使用命令行工具如findgrep等可以满足需求,但有时我们希望用编程语言来实现更加灵活和可定制化的解决方案。本文将介绍如何使用Python编写一个简单的文件查找工具,支持通配符匹配,并且可以在指定目录下递归查找文件。我们将提供两种不同的实现方式:一种基于os.walk()fnmatch,另一种基于glob模块。

环境准备

确保你已经安装了Python 3.x版本。如果你还没有安装,请访问Python官网下载并安装最新稳定版。


实现方式一:使用os.walk()fnmatch

实现思路
  1. 导入必要的库:我们将使用os模块来遍历目录结构,使用fnmatch模块来进行通配符匹配。
  2. 定义函数:创建一个名为find_files_with_os_walk的函数,该函数接收两个参数:一个是目标目录路径,另一个是包含通配符的文件名模式。
  3. 递归遍历目录:通过os.walk()方法遍历给定目录及其子目录。
  4. 匹配文件名:对于每个文件,使用fnmatch.fnmatch()检查其名称是否符合提供的模式。
  5. 返回结果:将所有符合条件的文件路径存储在一个列表中,并最终返回该列表。
代码实现
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模块

实现思路
  1. 导入必要的库:我们将使用glob模块,它可以直接处理通配符模式,简化了文件查找过程。
  2. 定义函数:创建一个名为find_files_with_glob的函数,该函数接收两个参数:一个是目标目录路径,另一个是包含通配符的文件名模式。
  3. 生成文件路径:通过glob.glob()方法生成符合条件的文件路径列表。
  4. 返回结果:直接返回生成的文件路径列表。
代码实现
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内置库快速构建带通配符的文件查找工具的方法:

  1. 使用os.walk()fnmatch:适用于需要更细粒度控制的情况,如过滤文件类型、排除某些目录等。
  2. 使用glob模块:简单直观,适合大多数常规文件查找任务。

这两种方法不仅简单易懂,而且非常灵活,可以根据实际需求进一步扩展功能,比如添加多线程支持以提高效率,或者集成到更大的应用程序中作为一部分功能。希望这篇技术文章对你有所帮助!

欢迎点赞、关注、转发、收藏!!!

作者简介

吉林白城 70后高级网络安全工程师,双专业、双工学学士学位。阿里云乘风者计划专家博主、51CTO网站合作博主。拥有超过20年的IT行业经验,专注于网络安全、人工智能、运维、数据分析及办公自动化。持有CISE和CISP-PTE认证,在安全架构设计与实施方面经验丰富。擅长利用Python解决复杂问题,推动自动化和效率提升。热衷于技术分享,帮助更多人掌握先进技术和方法。

如有网络安全、人工智能、训练应用大模型等方面业务需求。欢迎联系!

联系方式:

  • Email: 1134593154@qq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件

Logstash 过滤 Filter 插件 数据从源传输到存储库的过程中&#xff0c;Logstash 过滤器能够解析各个事件&#xff0c;识别已命名的字段以构建结构&#xff0c; 并将它们转换成通用格式&#xff0c;以便进行更强大的分析和实现商业价值。 Logstash 能够动态地转换和解析数据&a…

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…

1.2.1-2部分数据结构的说明02_链表

&#xff08;1&#xff09;链表数据结构&#xff1a; 概念&#xff1a; 将列表中相互连接的节点不连续的存储在内存中。与数据不同&#xff0c;我们无法再恒定时间内访问任何元组&#xff0c;如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…

C# 之某度协议登录,JS逆向,手机号绑定,获取CK

.NET兼职社区 .NET兼职社区 .NET兼职社区 .NET兼职社区 有需要指导&#xff0c;请私信我留言V或者去社区找客服。

SpringcloudAlibaba黑马笔记(部分)

第一章 微服务介绍 1.1 系统架构演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致系统架构也在不断的进行变化。 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程 : 单体应用架构 ---> 垂直应用架构 ---> 分布 …

Redis 基础篇

一、redis 概念及特性 1.1 Redis 概念 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的高性能键值存储数据库&#xff0c;可以用作数据库、缓存和消息中间件。 redis 官网&#xff1a;Redis - The Real-time Data P…

DAY15 神经网络的参数和变量

DAY15 神经网络的参数和变量 一、参数和变量 在神经网络中&#xff0c;参数和变量是两个关键概念&#xff0c;它们分别指代不同类型的数据和设置。 参数&#xff08;Parameters&#xff09; 定义&#xff1a;参数是指在训练过程中学习到的模型内部变量&#xff0c;这些变量…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

Chromium源码windows下载和编译

官方地址&#xff1a;chromium/docs/windows_build_instructions.md at main chromium/chromium GitHub Chromium介绍 Chromium 是一个开源浏览器项目&#xff0c;旨在为所有用户构建更安全、更快、更稳定的网络体验方式。掌握Chromium的编译和开发是浏览器项目相关的开发者…

maven如何从外部导包

1.找到你项目的文件位置&#xff0c;将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

力扣 跳跃游戏

每次更新目标位置时&#xff0c;实际上是在做一个局部的最优选择&#xff0c;选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时&#xff0c;都是基于当前能跳跃到的最远位置&#xff0c;因此最终的结果是全局最优的。 题目 从前往后遍历&#xff0c;更新可以到…

第二十八周学习周报

目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型&#xff0c;其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验&#xff08;GFP&…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

Electron快速入门——跨平台桌面端应用开发框架

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

SpringBoot之核心配置

学习目标&#xff1a; 1.熟悉Spring Boot全局配置文件的使用 2.掌握Spring Boot配置文件属性值注入 3.熟悉Spring Boot自定义配置 4.掌握Profile多环境配置 5.了解随机值设置以及参数间引用 1.全局配置文件 Spring Boot使用 application.properties 或者application.yaml 的文…

openai swarm agent框架源码详解及应用案例实战

文章目录 简介数据类型Agent类Response类Result类Swarm类run_demo_loop交互式会话 基础应用agent-handsofffunction-callingcontext_variablestriage_agent 高阶应用通用客服机器人(support bot)构建航班服务agent 参考资料 openai 在24年10月份开源了一个教育性质的多agents协…

JVM vs JDK vs JRE

JVM是Java虚拟机的缩写&#xff0c; 用于实现Java的一次编译&#xff0c;处处运行。 Java代码写成.class后&#xff0c;由本地的虚拟机运行。 JDK&#xff08;Java Development Kit&#xff09;是一个功能齐全的 Java 开发工具包&#xff0c;供开发者使用。 JDK包含了JRE。…

【网页自动化】篡改猴入门教程

安装篡改猴 打开浏览器扩展商店&#xff08;Edge、Chrome、Firefox 等&#xff09;。搜索 Tampermonkey 并安装。 如图安装后&#xff0c;浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name&#xff1a;脚本名称。…

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用&#xff0c;然而手机又涉及到各种系统及版本&#xff0c;所以对SSL证书也有要求&#xff0c;如果要小程序可以安全有效的访问需要满足以下要求&#xff1a; 1、原厂SSL证书&#xff08;原厂封&#xff09;。 2、DV单域名或者DV通配符。 3、兼…

【电子通识】PWM驱动让有刷直流电机恒流工作

电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作&#xff0c;其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时&#xff0c;电机会怎样工作呢&#xff1…