即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

yield的表达式用法 模拟linuxGrep命令

编程语言 wuxingpu5 13℃ 0评论

模拟grep命令 使用yield 接收

目录 结构

a

——-b

b.txt

a.txt

文件里面写上包含的关键字 如Python  


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

#此为最终结果  已经可以查找到有关键字的文件
'''
grep -rl 'python' /root
'''
import os

def init(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        next(res)
        return res
    return wrapper

@init #生成器调用装饰器
def search(target):
    '''取出所有文件路径'''
    #更改为生成器
    while True:
        search_path = yield
        g=os.walk(search_path)
        for par_dir,_,files in g:
            for file in files:
                file_abs_path=r'%s\%s'%(par_dir,file)
              #  print('file_abs_path is ==>: ',file_abs_path)
                target.send(file_abs_path)
#g=search()

#d=r'D:\code\py\py3\Coursepy'
#g.send(d)

@init
def opener(target):
    while True:
        file_abs_path=yield
      #  print('opener==>: ',file_abs_path)
        with open(file_abs_path,encoding='utf-8') as f:
            target.send((file_abs_path,f))
        #    pass
#o=opener()
#o.__next__
#o.send('/2.py')
#g=search(opener())   # 将opener函数传送给search   直接在search函数里直接打开
#g.send(d)   测试发送文件打开

@init
def cat(target):
    '''遍历文件内容'''
    while True:
        file_abs_path,f=yield
        for line in f:
            #print(line)
           # print('file_abs_path & line : ',file_abs_path,line)
            target.send((file_abs_path,line))
@init
def grep(target,pattern):
    while True:
        file_abs_path,line=yield
        if pattern in line:
            target.send(file_abs_path)
@init
def printer():
    while True:
        file_abs_path=yield
        print(file_abs_path)

#将文件路径发送给函数
xx=r'D:\code\py\py3\Coursepy\L05\a\b\b'
x=r'D:\code\py\py3\Coursepy\L05\a'
gg=search(opener(cat(grep(printer(),'python'))))
#print(gg)
gg.send(x)




扩展  添加了标志位  防止出现一个文件中多行包含内容 出现多次打印文件名的问题

示例见:

https://github.com/5StevenWu/Coursepy/blob/master/L05/%E8%A1%A8%E8%BE%BE%E5%BC%8Fyield%E7%9A%84%E7%94%A8%E9%80%942.py

转载请注明:CodingBlog » yield的表达式用法 模拟linuxGrep命令

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情