面向过程编程实例------grep-rl 'root 路径

#应用:grep -rl 'root' /etc

import os
def deco(func):
    def wrapper(*args):
        g=func(*args)
        next(g)
        return g
    return wrapper

start_path=r'/Users/mona/Desktop/python学习/study/a'

#阶段一:递归地找文件的绝对路径,把路径给阶段二
@deco
def search_func(target):
    while True:
        start_path=yield
        g=os.walk(start_path)
        for par_dir,_,files in g:
            for file in files:
                file_path=r'%s/%s'%(par_dir,file)
                target.send(file_path)

#阶段二:收到文件路径,打开文件获取对象,并把文件对象发给阶段三
@deco
def open_func(target):
    while True:
        file_path=yield
        with open(file_path,'r',encoding='utf-8') as f:
            target.send((file_path,f))

#阶段三收到文件对象,读取每一行,并把内容发给阶段四
@deco
def cat_func(target):
    while True:
        file_path,f=yield
        for line in f :
            res=target.send((file_path,line))
            if res:
                break

#阶段四:收到内容,判断root是否在内容中,把符合条件的文件名发给阶段五
@deco
def gerp_func(target,pattern):
    tag=False
    while True:
        file_path,line=yield tag
        tag=False
        if pattern in line:
            target.send(file_path)
            tag=True

#阶段五:收到文件名,并打印
@deco
def printer_func():
    while True:
        filename=yield
        print(filename)

g=search_func(open_func(cat_func(gerp_func(printer_func(),'root'))))
g.send(start_path)
原文地址:https://www.cnblogs.com/mona524/p/7050094.html