小练习
应用:递归一个目录的文件夹,判断将该目录内及子目录内的文件内容是否包含指定字符串,如果有那么将该文件绝对路径打印出来
分析:
阶段一:递归地找文件的绝对路径,把路径发给阶段二
阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
阶段五:收到文件名,打印结果
from os import walk
def init(fn):
def wrapper(*args,**kwargs):
g = fn(*args,**kwargs)
next(g)
return g
return wrapper
#阶段一:递归地找文件的绝对路径,把路径发给阶段二
@init
def search(target):
while True:
start_path = yield
paths = walk(start_path)
for par_dir,_,files in paths:
for file in files:
file_path = r'%s\%s' %(par_dir,file)
target.send(file_path)
#阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def opener(target):
while True:
file_path = yield
with open(file_path,encoding='utf-8') as rfile:
target.send((file_path,rfile))
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
while True:
file_path,rfile = yield
for line in rfile:
res = target.send((file_path,line))
if res == True:
break
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
tag = False
while True:
file_path,line=yield tag
tag = False
if pattern in line:
tag = True
target.send(file_path)
#阶段五:收到文件名,打印结果
@init
def printer():
while True:
file_path = yield
print(file_path)
start_path = r'E:\javawork_py\PyTest\ClassTest\Day_21'
g = search(opener(cat(grep(printer(),"root"))))
g.send(start_path)