status

草稿

ZoomQuiet

80%

1. -3 PyDay 进行功能化

不断的否定自己,但是要坚持最初的妄想 --不论战术上如何变化,千万不要忘记战略目标

如果小白真正理解和可以自如应用前一日那四行代码中包含的各种知识,那未,离完成软件就真的不远了

1.1. 需求

首先小白根据己有的体验,对需求进行了进一步细化:

  1. 可以将光盘内容索引存储为硬盘上的文本文件
    • 存储成*.cdc 的文本文件

    • 可以快速指定文件名
  2. 可以根据储存到硬盘上的光盘信息进行搜索
    • 可以搜索指定目录中所有*.cdc文件

这样一来 PyCDC的使用,其实分两部分:

  1. 刻录光盘时,将光盘信息通过 PyCDC 存储为对应同光盘的标号的 *.cdc 文件

  2. 使用光盘时,在 PyCDC 中搜索,确认 .cdc文件名,即是光盘标号,从而针对性的读取光盘就好,不用遍寻所有光盘了!

1.2. 功能化?

简单的讲就是将以往验证想法的代码,变成可以方便使用的功能,可以重复在不同应用环境中使用, 小白想象自个儿的 PyCDC可以象普通的命令行工具一样使用,先:

python pycdc.py -e mycd1-1.cdc
#将光盘内容记录为 mycd1-1.cdc
python pycdc.py -e cdc/mycd1-1.cdc
#将光盘内容记录到 cdc 目录中的 mycd1-1.cdc
python pycdc.py -d cdc -k 中国火
#搜索 cdc 目录中的光盘信息,寻找有“中国火”字样的文件或是目录,在哪张光盘中

可能还有其它的功能,但是最核心的功能应该就是这两种3样

要想达到这种效果 直接的说,就是函式化!

1.2.1. 函式化?

声明函式名,定义参数,然后使用缩进,将前一日摸索出来的代码包装一下,使用参数代替原先指定的目录和文件名: PyDay-3-1.py

   1 # coding : utf-8
   2 import os
   3 def cdWalker(cdrom,cdcfile):
   4     export = ""
   5     for root, dirs, files in os.walk(cdrom):
   6         export+="\n %s;%s;%s" % (root,dirs,files)
   7     open(cdcfile, 'w').write(export)
   8 cdWalker('/media/cdrom0','cd1.cdc')
   9 cdWalker('/media/cdrom0','cd2.cdc')

小白获得了第一个python 函式并成功的运行了两次,将同张光盘的内容记录到不同的文件中,嗯嗯嗯!非常easy

1.2.2. 系统参数

但是如何获得从命令行给入的参数呢?

搜索或是询问后,从行者哪又获得一个提示: print sys.argv

那么无畏的小白立即创建一个将进行真正使用的功能脚本 pycdc-v0.1.py ,并尝试加入最新提示代码:

   1 # coding : utf-8
   2 import os
   3 print sys.argv
   4 def cdWalker(cdrom,cdcfile):
   5     export = ""
   6     for root, dirs, files in os.walk(cdrom):
   7         export+="\n %s;%s;%s" % (root,dirs,files)
   8     open(cdcfile, 'w').write(export)
   9 #cdWalker('/media/cdrom0','cd1.cdc')

运行一下:

OK,出错了,但是有了 os 模块的经验,瞧sys.argv 这么眼熟,小白猜这是个模块,需要引入,所以微小的改动一下:

   1 # coding : utf-8
   2 import os,sys
   3 print sys.argv
   4 def cdWalker(cdrom,cdcfile):
   5     export = ""
   6     for root, dirs, files in os.walk(cdrom):
   7         export+="\n %s;%s;%s" % (root,dirs,files)
   8     open(cdcfile, 'w').write(export)
   9 #cdWalker('/media/cdrom0','cd1.cdc')

运行一下:

Great! 一切如愿,然后就是简单的识别参数问题了:

1.2.3. 逻辑判断

正如其它语言类似,什么if,else 等等编辑判别,Python 同样的有,找到相关章节,照猫画虎:

   1 # coding : utf-8
   2 import os,sys
   3 CDROM = '/media/cdrom0'
   4 def cdWalker(cdrom,cdcfile):
   5     export = ""
   6     for root, dirs, files in os.walk(cdrom):
   7         export+="\n %s;%s;%s" % (root,dirs,files)
   8     open(cdcfile, 'w').write(export)
   9 #cdWalker('/media/cdrom0','cd1.cdc')
  10 if "-e"==sys.argv[1]:
  11     cdWalker(CDROM,sys.argv[2])
  12     print "记录光盘信息到 %s" % sys.argv[2]
  13 else:
  14     print '''PyCDC 使用方式:
  15     python pycdc.py -e mycd1-1.cdc
  16     #将光盘内容记录为 mycd1-1.cdc
  17     '''

注解:

  1. 使用全局参数 CDROM 指定当前的光盘访问路径,总是/media/cdrom0

  2. 通过if "-e"==sys.argv[1] 判定 第二个参数是-e 时,使用第三个参数作输出文件名记录光盘信息,并输出提示

  3. 通过else 捕获所有意外情况,输出错误提示,结束脚本

OK,看起来,应该已经完成了功能1~2,但是实际运行时:

... 尝试带目录的输出时:IOError: [Errno 2] No such file or directory: 'cdc/mycd-1.cdc' I/O -- 输入/出问题,嗯嗯嗯,当然了,cdc 目录不存在哪..

手工建立后,再运行就OK了,所以功能设计细化为:

$python pycdc.py -e mycd1-1.cdc
#第2个参数是"-e";使用cdWalker()将光盘内容记录为 mycd1-1.cdc
$python pycdc.py -e cdc/mycd1-1.cdc
#第2个参数是"-e";而且第3个参数中含有目录指定;将光盘内容记录到 cdc 目录中的 mycd1-1.cdc;如果 cdc 目录不存在,可以自动创建
$python pycdc.py -d cdc -k 中国火
#第2个参数是"-d";而且第4个参数是"-k";搜索 cdc 目录中的光盘信息,寻找有关键字“中国火”的文件或是目录,在哪张光盘中

完成以上所有功能和判定部分的伪代码:

if "-e"==sys.argv[1]:
    #判别sys.argv[2]中是否有目录,以便进行自动创建
    cdWalker(CDROM,sys.argv[2])
    print "记录光盘信息到 %s" % sys.argv[2]
elif "-d"==sys.argv[1]:
    if "-k"==sys.argv[3]:
        #进行文件搜索
    else:
        print '''PyCDC 使用方式:
        python pycdc.py -d cdc -k 中国火
        #搜索 cdc 目录中的光盘信息,寻找有“中国火”字样的文件或是目录,在哪张光盘中
        '''
else:
    print '''PyCDC 使用方式:

呜乎矣哉..小白已经开始头大了,如果功能继续追加,软件进一步友好的自动识别各种意外情况的话,这棵逻辑树将会可怕的增长下去...

小白没有耐心和信心面对如此复杂的情况判别,开始寻找其它解决方案...

1.3. 小结

为了快速将已知技巧转化为可用脚本,小白接触到了以下知识

  1. sys 模块的 接收系统参数
  2. 函式概念
  3. 逻辑判定语句
  4. 伪代码技术,进行开发复杂度的估算

1.4. 练习

  1. 根据 DiPy 10.6. 处理命令行参数 使用getopt.getopt() 优化当前功能函式


::-- ZoomQuiet [2007-02-22 05:30:08]

Name Password4deL ;) :( X-( B-)
BenLuo   mydoc1.cdc 的名字不够 unix 风格。用 foo1.cdc 是不是更好。
2007-03-01 23:37:58
BenLuo   应该是 foo.cdc
2007-03-01 23:38:35