码迷,mamicode.com
首页 > 编程语言 > 详细

《可爱的Python》读书笔记(四)

时间:2018-03-21 23:46:25      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:grep   递归调用   

不断否定自己,但要坚持最初的意愿。


小白已经实现了"将光盘内容索引存储为硬盘上的*.cdc文本文件",并获得了命令行工具样的程序,可以通过命令行调用python pycdc.pyw -e test.txt快速指定文件名。

类似grep一样,现在要实现搜索的功能,打开所有符合要求的文件,读取每一行,如果有指定关键词在行内就打印输出到屏幕……

结合已有的经验,可以非常简单地实现!


# -*- coding: utf-8 -*-
import os


def cdcGrep(cdcpath, keyword):

    filelist = os.listdir(cdcpath)        # 搜索目录中的文件
    for cdc in filelist:                  # 循环文件列表
        if ".cdc" in cdc:                 # 过滤器其他文件,只关注.cdc
            print('找到目标文件:{}'.format(cdc))
            cdcfile = open(cdcpath + cdc)       # 拼接文件路径,并打开文件
            for line in cdcfile.readlines():    # 读取文件每一行,并循环
                if keyword in line:             # 判断是否有关键词在行中
                    print(line)
                    
cdcGrep('F:\\back\\', 'images')

以上代码可以扫描出指定目录"f:\back\"下的名称中含有".cdc"中带有关键词的"images"行。

运行结果如下:

 找到目标文件:test1.cdc
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']
 找到目标文件:test2.cdc
 E:\iso\CentOS-6.8-x86_64-bin-DVD1;['EFI', 'images', 'isolinux', '[BOOT]'];['.discinfo', '.treeinfo', 'CentOS_BuildTag', 'EULA', 'GPL', 'RELEASE-NOTES-en-US.html', 'RPM-GPG-KEY-CentOS-6', 'RPM-GPG-KEY-CentOS-Debug-6', 'RPM-GPG-KEY-CentOS-Security-6', 'RPM-GPG-KEY-CentOS-Testing-6', 'TRANS.TBL']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL']


在上面的grep 实现例子中,没有考虑子目录的处理方式,因为如果直接open目录进行读操作,会出现错误。接下来将改进这段代码,以便考虑到子目录这种特殊情况。


# -*- coding: utf-8 -*-
import os


def cdcGrep(cdcpath, keyword):

    expDict = {}
    filelist = os.listdir(cdcpath)         # 搜索目录中的文件
    cdcpath = cdcpath + "\\"
    for cdc in filelist:                   # 循环文件列表
        if os.path.isdir(cdcpath+cdc):
            print(cdcpath+cdc)
            cdcGrep(cdcpath+cdc, keyword)  # 若是子目录,则递归调用完成查找
        else:
            if cdc.endswith('.cdc'):
                print(cdc)
                cdcfile = open(cdcpath + cdc)      # 拼合文件路径,并打开文件
                for line in cdcfile.readlines():   # 读取文件每一行,并循坏 
                    if keyword in line:            # 判断是否有关键词在行中
                        print(line)
                        

cdcGrep('F:\\back\\', 'images')

运行结果如下:

搜索子目录F:\back\\1
找到目标文件:test1.cdc
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']
搜索子目录F:\back\\2
找到目标文件:test2.cdc
 E:\iso\CentOS-6.8-x86_64-bin-DVD1;['EFI', 'images', 'isolinux', '[BOOT]'];['.discinfo', '.treeinfo', 'CentOS_BuildTag', 'EULA', 'GPL', 'RELEASE-NOTES-en-US.html', 'RPM-GPG-KEY-CentOS-6', 'RPM-GPG-KEY-CentOS-Debug-6', 'RPM-GPG-KEY-CentOS-Security-6', 'RPM-GPG-KEY-CentOS-Testing-6', 'TRANS.TBL']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']
找到目标文件:test3.cdc
 E:\iso\CentOS-6.8-x86_64-bin-DVD1;['EFI', 'images', 'isolinux', '[BOOT]'];['.discinfo', '.treeinfo', 'CentOS_BuildTag', 'EULA', 'GPL', 'RELEASE-NOTES-en-US.html', 'RPM-GPG-KEY-CentOS-6', 'RPM-GPG-KEY-CentOS-Debug-6', 'RPM-GPG-KEY-CentOS-Security-6', 'RPM-GPG-KEY-CentOS-Testing-6', 'TRANS.TBL']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images;['pxeboot'];['efiboot.img', 'efidisk.img', 'install.img', 'TRANS.TBL']

这边对子目录处理,使用了递归调用cdcGrep()来实现。


总结:本节实现了搜索的功能,学习了函数的递归调用。

《可爱的Python》读书笔记(四)

标签:grep   递归调用   

原文地址:http://blog.51cto.com/9473774/2089630

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!