没有完美的软件,够用并且容易使用的软件已经算是完美的了。


今天整理这几天的代码

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


class PyCDC(cmd.Cmd):


    def __init__(self):
    
        # 初始化基类
        cmd.Cmd.__init__(self)
        self.CDROM = 'E:\\iso\\CentOS-6.8-x86_64-bin-DVD1'
        self.CDDIR = 'F:\\back\\'
        # 定义命令行环境的前缀字符
        self.prompt = "(PyCDC)>"
        # 定义命令行环境的最初提示
        self.intro = """使用说明:
        dir 目录名   # 指定保存和搜索目录,默认是"F:\\back\\"
        walk 文件名  # 指定光盘信息文件名,使用"*.cdc"
        find 关键词  # 使用在保存和搜索目录中遍历所有.cdc文件,输出含有关键词的行
        ?     #查询
        quit  #推出系统,也可以使用Ctrl+D(Unix)|Ctrl+Z(Dos/windows)
        """
        
    def do_walk(self, filename):  
        if filename == "":
            filename = input("请输入cdc文件名:")
        print("指定保存的文件名为:'%s'" % filename)
        cdWalker(self.CDROM, self.CDDIR+filename)
        
    def help_walk(self):  
        print("扫描指定路径的目录结构,并输出到指定的'.cdc'文件中")
        
    def do_dir(self, pathname):
        if pathname == "":
            pathname = input("请输入指定保存/搜索目录(默认是:'%s'):" % (self.CDDIR))
        self.CDDIR = pathname
        print("指定保存/搜索目录为:'%s'" % (pathname))
        mkdir(pathname)
        
    def help_dir(self):
        print("指定保存/搜索目录")
        
    def do_find(self, keyword):
        if keyword == "":
            keyword = input("请输入搜索关键词:")
        print("指定搜索关键词为:'%s'" % keyword)
        cdcGrep(self.CDDIR, keyword)
        
    def help_find(self):
        print("搜索关键词")
      
    def do_quit(self, arg):
        sys.exit()
        
    def help_quit(self):
        print("退出程序")
        
    # 定义quit的快捷方式
    do_q = do_quit
    
    
def cdWalker(cdrom, cdcfile):
    '''
    扫描指定路径的目录结构并保存为新的文件
    '''
    export = []
    for root, dirs, files in os.walk(cdrom):
        export.append("\n %s;%s;%s" % (root, dirs, files))
    open(cdcfile, 'w').write(''.join(export))
    print('扫描目录结构保存到{}'.format(cdcfile))
    
def cdcGrep(cdcpath, keyword):
    '''
    光盘信息文本关键词搜索
    '''
    # 搜索目录中的文件
    filelist = os.listdir(cdcpath)
    cdcpath = cdcpath + "\\"
    # 循环文件列表
    for cdc in filelist:                   
        if os.path.isdir(cdcpath+cdc):
            print('搜索子目录{}'.format(cdcpath+cdc))
            # 若是子目录,则递归调用完成查找
            cdcGrep(cdcpath+cdc, keyword)
        else:
            if cdc.endswith('.cdc'):
                print('找到目标文件:{}'.format(cdc))
                # 拼合文件路径,并打开文件
                cdcfile = open(cdcpath + cdc)
                # 读取文件每一行,并循坏
                for line in cdcfile.readlines():
                    exist = False
                    # 判断是否有关键词在行中
                    if keyword in line:
                        print(line)
                        exist = True
                if not exist:
                    print('文件{}中,找不到关键词{}'.format(cdc, keyword))
                        
def mkdir(pathname):
    '''
    自动创建不存在的目录
    '''
    # 去除首尾空格
    path=pathname.strip()
     # 去除尾部 \ 符号
    path=pathname.rstrip("\\")
    # 判断路径是否存在
    if not os.path.exists(pathname):
        try:
            # 创建目录
            os.makedirs(pathname)
        except FileNotFoundError as reason:
            print(reason)
        else:
            print('指定的目录不存在,将自动为您创建')
            
if __name__ == '__main__':
    cdc = PyCDC()
    cdc.cmdloop()

运行效果如下:

使用说明:
        dir 目录名   # 指定保存和搜索目录,默认是"F:\back\"
        walk 文件名  # 指定光盘信息文件名,使用"*.cdc"
        find 关键词  # 使用在保存和搜索目录中遍历所有.cdc文件,输出含有关键词的行
        ?     #查询
        quit  #推出系统,也可以使用Ctrl+D(Unix)|Ctrl+Z(Dos/windows)
        
(PyCDC)>walk
请输入cdc文件名:1.cdc
指定保存的文件名为:'1.cdc'
扫描目录结构保存到F:\back\1.cdc
(PyCDC)>?dir
指定保存/搜索目录
(PyCDC)>dir
请输入指定保存/搜索目录(默认是:'F:\back\'):G:\back\
指定保存/搜索目录为:'G:\back\'
[WinError 3] 系统找不到指定的路径。: 'G:\\'
(PyCDC)>dir F:\back\bak\
指定保存/搜索目录为:'F:\back\bak\'
指定的目录不存在,将自动为您创建
(PyCDC)>walk 2.cdc
指定保存的文件名为:'2.cdc'
扫描目录结构保存到F:\back\bak\2.cdc
(PyCDC)>find
请输入搜索关键词:image
指定搜索关键词为:'image'
找到目标文件:2.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']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']
(PyCDC)>dir F:\back
指定保存/搜索目录为:'F:\back'
(PyCDC)>find images
指定搜索关键词为:'images'
找到目标文件:1.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']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']
搜索子目录F:\back\back1
搜索子目录F:\back\back1\back11
搜索子目录F:\back\back2
搜索子目录F:\back\bak
找到目标文件:2.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']
 E:\iso\CentOS-6.8-x86_64-bin-DVD1\images\pxeboot;[];['initrd.img', 'TRANS.TBL', 'vmlinuz']
(PyCDC)>find cd
指定搜索关键词为:'cd'
找到目标文件:1.cdc
文件1.cdc中,找不到关键词cd
找到目标文件:11.cdc
文件11.cdc中,找不到关键词cd
搜索子目录F:\back\\back1
搜索子目录F:\back\\back1\back11
搜索子目录F:\back\\back2
搜索子目录F:\back\\bak
找到目标文件:2.cdc
文件2.cdc中,找不到关键词cd
(PyCDC)>q


以上代码加入了“在手动指定了不存在的保存/搜索目录时将自动创建该目录”的功能,实现了完成版本的PyCDC!