Python学习之旅-19

小练习

应用:递归一个目录的文件夹,判断将该目录内及子目录内的文件内容是否包含指定字符串,如果有那么将该文件绝对路径打印出来

分析:

  阶段一:递归地找文件的绝对路径,把路径发给阶段二

  阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三

  阶段三:收到文件对象,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)

python内置函数

python内置函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值