模拟grep -rl “python” F:\xuyaping这个命令
#查看xuyaping文件夹所有的绝对路径
import os
g=os.walk("F:\\xuyaping") #g为迭代器
for i in g:
# print(i) #i为文件路径
for j in i[-1]:
file_path="%s\\%s" %(i[0],j)
print(file_path)
程序输出结果:
F:\xuyaping\xuyaping.txt.txt F:\xuyaping\xuyaping1.txt.txt F:\xuyaping\a\a.txt.txt F:\xuyaping\a\a1\a1.txt.txt F:\xuyaping\a\a1\a2\a2.txt.txt F:\xuyaping\b\b.txt.txt
代码如下:
#模拟grep -rl “python” F:\xuyaping这个命令
import os,time
#初始化被装饰的函数,使其运行到yield所在的行
def init(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper
#search函数用循环找到一个绝对路径,往下一个阶段opener函数传递一次,直至传递完。
# 所以opener函数循环的收,所以opener函数用while循环。
@init
def search(target): #定义生成器target,用于传递路径file_path
"找到文件的绝对路径"
while True:
dir_name=yield
print("车间search开始生产产品:文件的绝对路径")
time.sleep(1)
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) #传递路径file_path,给opener函数
@init
def opener(target):
"打开文件,获取文件句柄"
while True:
file_path=yield #opener函数接收search函数传递过来的路径file_path。opener函数将执行结果传递给search函数中的target
print("车间opener开始生产产品:文件句柄")
time.sleep(1)
with open(file_path) as f:
target.send((file_path,f)) #同样传递句柄f 和file_path给cat函数,所以此时用生成器target来传递,同上
@init
def cat(target):
"读取文件内容"
while True:
file_path,f=yield #cat函数接收opener函数传递过来的句柄f 和file_path。cat函数将执行结果传递给opener函数中的target
print("车间cat开始生产产品:文件的一行内容")
time.sleep(1)
for line in f:
target.send((file_path,line))
@init
def grep(pattern,target):
"过滤一行内容中有无python"
while True:
file_path,line=yield
print("车间grep开始生产产品:包含python这一行内容的文件路径")
time.sleep(1)
if pattern in line:
target.send(file_path)
@init
def printer():
"打印文件路径"
while True:
file_path=yield
print("车间printer开始生产产品:得到最终的产品")
time.sleep(1)
print(file_path)
#g=search("target")--->g=search(opener(target))--->g=search(opener(cat(target)))
# --->g=search(opener(cat(grep(patteren,target))))--->g=search(opener(cat(grep("python",printer()))))
g=search(opener(cat(grep("python",printer()))))
g.send("F:\\xuyaping")
运行结果:
车间search开始生产产品:文件的绝对路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\xuyaping.txt.txt 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\xuyaping1.txt.txt 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\a\a1\a1.txt.txt 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\b\b.txt.txt 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径
原文:http://www.cnblogs.com/xuyaping/p/6701094.html