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

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

今天整理这几天的代码

# -*- 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!

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

时间: 2024-10-09 22:47:24

《可爱的Python》读书笔记(六)的相关文章

IDA.Pro权威指南 读书笔记

http://www.pediy.com/kssd/pediy12/142766.html 标 题:IDA.Pro权威指南 读书笔记[Made By C_lemon] 作 者:Dstlemoner 时 间:2011-11-14 11:56:17 链 接:http://bbs.pediy.com/showthread.php?t=142766    IDA为反汇编 和逆向破解的 静态分析利器 ! 虽然是利器,但是你不会用的话~那就另当别论了. →     唉.对于刚入门的新手来说,看前人走过的路程

Hadoop权威指南读书笔记

本书中提到的Hadoop项目简述 Common:一组分布式文件系统和通用I/O的组件与接口(序列化.javaRPC和持久化数据结构). Avro:一种支持高效.跨语言的RPC以及永久存储数据的序列化系统. MapReduce:分布式数据处理模型和执行环境,运行于大型商业集群. HDFS:分布式文件系统,运行于大型商用机集群. Pig:一种数据流语言和运行环境,用以检索非常大的数据集.Pig运行在MapReduce和HDFS的集群上. Hive:一个分布式.按列存储的数据仓库.Hive管理HDFS

Android编程权威指南-读书笔记(二)-第一个小程序

Android编程权威指南-读书笔记(二) -第一个小程序 第一个例子介绍 应用名为GeoQuiz.用户通过单击True或False按钮来回答屏幕上的问题,GeoQuiz可即时反馈答案正确与否. 这个例子为我们简单介绍了几个基本组件的使用,以及基本的事件监听.让我们对基本组件的使用和事件的监听有一个基本的了解. 这篇文章分为2个部分,第一部分就是创建简单的UI.第二个部分就是对这个UI增加代码来响应一些操作. (注:所有不明白或者不理解的东西其实都不重要,后面都会有更详细的介绍.) 本章的目标

css权威指南 读书笔记

网上看见推荐的书总是喜欢买回家,但是大多数时候都不会立即就看,都是在书橱里蒙上了一层灰尘.从毕业到现在,由于公司业务原因,写js多余css,所以就想系统地看看css,并且做一些练习,于是就开始看<css权威指南>,看到了第六章,初步感觉,对于工作一年的我来说,很简单,当然也有一些我不熟悉的知识点,于是整理了下来. 一.@import 1.放在style容器中,且在其他css规则之前 2.每个人@import指令的样式都会加载使用 二.选择器 1.:first-letter 用于选取指定选择器的

JS权威指南读书笔记(六)

第十五章 脚本化文档 1 文档对象模型(DOM)是表示和操作HTML和XML文档内容的基础API. 2 文档节点的部分层次结构 Text和CDATASection都是characterData的子类型. 3 getElementsByNames() 定义在HTMLDocument类中,而不是Document(文档可能代表HTML也可能代表XML) 类中,所以只针对HTML文档可用. 4 由于历史原因,HTMLDocument类定义了一些快捷属性来访问各种各样的节点.例如:images.forms

JS权威指南读书笔记(二)

第四章 表达式和运算符 1 new调用构造函数的过程 a 创建一个新的空对象 b 设置空对象的_proto_指向构造函数原型prototype c 将这个新对象当做this的值来调用构造函数 d 如果构造函数不返回一个对象值,则返回新对象 2 左值:表示存储在计算机内存的对象. 3 除数为0的运算结果是正无穷大或负无穷大,0/0的结果是NaN. 4 位运算符会将NaN.Infinity和-Infinity都转换为0. 5 in运算符希望它的左操作数是一个字符串或可以转换为字符串,右操作数是一个对

HBase权威指南读书笔记(一)

第一章HBase简介 1.  HBase即hadoop数据库,HBase是一个分布式的.持久的.强一致性的存储系统,具有近似最优的写性能和出色的读性能. 2.  HBase并不是一个列式存储的数据库,但它利用了磁盘上的列式存储格式.传统的列式存储数据库适合实时存取数据的场景,HBase适合键值对的数据存储,或者有序的数据存储. 3.  一行由若干列组成,若干列又构成了一个列族(column family).列族数量只限于几十,实际上更少.而列的数量没有限制,一个列族里面可以有数百万个列,列值也没

JavaScript权威指南读书笔记【第一章】

第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自Java 一等函数来自Scheme 基于原型的继承来自于Self 名字和版本: JavaScript是由网景(Netscape)公司创建,“JavaScript”是Sun MicroSystem公司的注册商标,用来特指网景(Mozilla)对着门的实现. ECMAScript: 网景将这么语言作为标准

HTTP权威指南读书笔记

1.8 web组件结构: 代理 :位于客户端和服务器之间的HTTP中间实体 缓存 :HTTP的仓库,使常用页面的副本可以保存在离客户端很近的地方 网关 :链接其他应用程序的特殊web服务器(如邮件服务) 隧道 :对HTTP通信报文进行盲转的特殊代理 Agent代理:发起自动HTTP请求的半智能web客户端 1.8.1 代理: 原理:代理存在与客户端与服务器之间,接受客户端的HTTP请求并且转发给服务器 1.8.2 缓存: 原理:web缓存是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文

JS权威指南读书笔记(五)

第十三章 Web浏览器中的JavaScript 1 在Html文档中嵌入客户端4种JS代码方法 a 内联方式,放置在<script>标签之间 b 放置在<script>标签 src 属性指定的外部文件中 c 放置在HTML事件处理程序中 d 放置在URL中,"javascript:" 协议 2 在XHTML中,script标签中内容将被当做其他内容,如果JS代码包含了"<" 或 "&"字符,那么这些字符将被解