Python 协程递归遍历文件夹并打印匹配文件路径
本文介绍利用 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 递归遍历文件夹并打印满足条件文件路径的实例即为全部内容分享,希望能为大家提供有益参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









