Python 协程递归遍历文件夹并打印匹配文件路径

周予安
周予安
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍利用 Python 协程实现递归遍历文件夹并查找包含特定字段值的文件路径。通过装饰器简化生成器初始化,结合 os.walk 遍历子目录,逐层传递文件句柄与内容,最终打印满足条件的绝对路径。该方法结构清晰,适用于长期稳定的系统场景,但不具备高扩展性。

题目要求:利用协程机制遍历指定目录下的所有子文件及子文件夹,检查文件内容是否包含某个特定字段值,并打印出所有满足该条件的文件的绝对路径。

#!/user/bin/env python
# -*- coding:utf-8 -*-

#grep -rl "python" D:\devtools\workspace\python\aaa

import os

def init(func):
 def wrapper(*args,**kwargs):
  res=func(*args,**kwargs)
  res.send(None)
  return res
 return wrapper

@init
def search(target):
 '找到文件的绝对路径'
 while True:
  dir_name=yield
  g=os.walk(dir_name)
  for i in g:
   for j in i[-1]:
    file_path="%s\\%s"%(i[0],j)
    target.send(file_path)
@init
def get_file_handle(target):
 '获取文件句柄'
 while True:
  file_path=yield
  with open(file_path) as f:
   target.send((file_path,f))

@init
def cat_file(target):
 '读取文件'
 while True:
  file_path,f=yield
  for line in f:
   target.send((file_path,line))

@init
def printer(pattern):
 '打印满足过滤条件的文件'
 s=set()
 while True:
  file_path,line=yield
  if pattern in line:
   if file_path not in s:
    print(file_path)
   s.add(file_path)


g=search(get_file_handle(cat_file(printer("python"))))
g.send("D:\\devtools\\workspace\\python\\aaa")

引入装饰器后,无需在每次调用时手动执行 .send(None),形参 target 直接接收一个已初始化的生成器对象。

整体编程采用面向过程的开发思路。

面向过程方法要求预先设计好完整的处理流程。

其优势在于:a. 体系结构更加清晰;b. 有效简化了程序的复杂度。

其局限性在于:不具备良好的可扩展性(内部耦合度过高)。

典型应用场景:适用于那些长期运行且需求变化较小的软件系统,例如底层系统软件。

以上关于 Python 递归遍历文件夹并打印满足条件文件路径的实例即为全部内容分享,希望能为大家提供有益参考,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表