• Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能


    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

    面向过程的编程思想:流水线式的编程思想,在设计程序时,需要把整个流程设计出来

    优点:

    • 程序的体系结构更清晰
    • 简化程序的复杂度

    缺点:

    • 可扩展性及其差,所以i一般应用于不需要经常变化的软件,如:Linux内核,httpd,git等软件

    实例:

    实现类似Linux下的如下命令功能:

    cat -rl 'dir' |grep 'keywords'

    即查找‘dir目录下所有文件及子目录下的子文件的内容,并将包含‘keywords’的文件的绝对路径返回

     #面向过程式编程实现类似Linux下的cat -rl 'dir' |grep 'keywords'功能
     1 import os
     2 
     3 
     4 def init(func):
     5     """装饰器函数,完成生成器的初始化操作(next())"""
     6     def wrapper(*args, **kwargs):
     7         res = func(*args, **kwargs)
     8         next(res)
     9         return res
    10     return wrapper
    11 
    12 
    13 @init
    14 def serch(target):
    15     """寻找文件的绝对路径"""
    16     while True:
    17         dir_name = yield
    18         g = os.walk(dir_name)       #遍历该目录下所有的文件和文件夹
    19         for i in g:
    20             for j in i[-1]:
    21                 file_path = '%s\%s' % (i[0], j)        #将文件的绝对路径赋给变量
    22                 target.send(file_path)      #将文件路径传递给下个函数
    23 
    24 
    25 @init
    26 def opener(target):
    27     """打开文件,获取文件句柄"""
    28     while True:
    29         file_path = yield       #接收上个函数的文件路径
    30         with open(file_path, encoding='utf8') as f:
    31             target.send((file_path, f))     #将文件路径和文件内容变量f传递给下个函数
    32 
    33 
    34 @init
    35 def cat(target):
    36     """读取文件内容"""
    37     while True:
    38         file_path, f = yield        #接收文件路径和文件内容变量
    39         for line in f:
    40             target.send((file_path, line))      #将文件路径和文件行内容变量line传递给下个函数
    41 
    42 
    43 @init
    44 def grep(pattern, target):
    45     """过滤文件行内容是否包含关键字"""
    46     while True:
    47         file_path, line = yield     #接收文件路径和文件行内容变量
    48         if pattern in line:
    49             target.send(file_path)      #如果关键字变量‘pattern’存在于文件的行内容,将文件路径传递给下个函数
    50 
    51 
    52 @init
    53 def printer():
    54     """打印包含关键字的文件名"""
    55     while True:
    56         file_path = yield
    57         print(file_path)        #打印包含关键字的文件路径
    58 
    59 
    60 g = serch(opener(cat(grep('python', printer()))))   #调用函数,按定义的顺序层层调用
    61 g.send('D:Documentspy_fullstack_S4')              #传递欲搜寻的目录,执行关键字搜索

     

  • 相关阅读:
    使用BackgroundWorker组件进行异步操作编程《转》
    C#多线程控制进度条之长任务操作《转》
    模态进度条窗体实现<转>
    dev xtraReports使用《转》
    客户端IP
    WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息,所在城市《转》
    c#多线程 Invoke方法的使用<转>
    C# windowform进度条《转》
    XtraReports 打印控件的简单使用《转》
    hdu Marriage Match II
  • 原文地址:https://www.cnblogs.com/OldJack/p/6700330.html
Copyright © 2020-2023  润新知