命令 grep -rl 'python' 路径 :在一个目录下面找到含有字符串 python 内容的文件
通过一个命令来实现查找字符串的效果
一装饰器:给生成器一个初始化
def init(func): def inner(*args,**kwargs): res=func(*args,**kwargs) next(res) #装饰器初始化一次 return res return inner
二 拿到文件下所有文件的绝对路径
@init def search(target): while True: filepath=yield g = os.walk(filepath) # 生成器 for pardir,_,files in g: for file in files: abs_path=r'%s\%s'%(pardir,file) target.send(abs_path)
三 打开文件拿到文件对象
@init def opener(target): while True: abs_path=yield # print('opener func--->',abs_path) with open(abs_path,'rb') as f: #把 abs_path,f 传给下一个阶段 target.send((abs_path,f))
四 读取文件的每行内容
@init def cat(target): while True: abs_path, f=yield for line in f: res=target.send((abs_path,line)) if res: break
五判断字符是否在里面
@init def grep(target,pattern): pattern = pattern.encode('utf-8') res=False #作用:变量要用的话先定义 while True: #一直循环前面文件传过来的值 abs_path,line=yield res #yield后面是传的值 res=False #保证判断之前res都为False if pattern in line: res=True #改变了res的值 target.send(abs_path)
六打印最终的文件路径
@init def printer(): while True: abs_path=yield print('<%s>'%abs_path) g=search(opener(cat(grep(printer(),'python')))) g.send(r'G:studyday09a')
七执行需要的查找命令
g=search(opener(cat(grep(printer(),'python')))) g.send(r'G:studyday09a')