status

校对

ZoomQuiet

100%

1. CDay 1 优化!对自个儿的反省

~ 首次重构优化数据结构

没有最好,只有更合理!

1.1. 扩展需求

小白到现在已经实现的功能:

  1. 扫描光盘内容并存储为硬盘上的文本文件
    • 存储成*.cdc 的文本文件 cdctools.cdWalker()

    • 可以快速指定保存目录 PyCDC.do_dir()

    • 可以快速指定保存的文件名 PyCDC.do_walk()

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

    • 可以指定关键字进行搜索 PyCDC.do_find()

      • 列出所有含有关键字的信息行

而且,组织好了文档化的注释,足以让有心人快速了解整体程序结构,复用相关函式,或是掺合持续改进,这不真有另外的小白有了反馈

1.2. 问一声

为什么叫 PyCDC ? 和CD Catalog Expert 有关系嘛?

1.2.1. Disk Catalog

磁盘分类

1.2.2. 对比及推导

那么哪种比较好?

  • 小白当然原意令自个儿的小工具发扬光大下去
  • 那么改进不可避免!
  • 其实记录的摘要文本已经升级过一次级
    • os.walk() 输出的自然结构格式:

/media/cdrom0/EVA/Death-Rebirth;[];['eva8-01.Mp3', 'eva8-02.Mp3',...]
    ^                          ^ ^  ^ 
    |                          | |  +- files列表,此目录的文件名 
    |                          | +- 各个数据段使用";" 分隔
    |                          +- dirs列表,子目录名,如果没有就为空
    +- 当前目录

  • 使用专门的formatCDinfo() 函式格式化为

    ...
    -f /media/cdrom0/RyokoHirosue/Ryoko Hirosue-files.files  title.gif 
    ======================================================================
    /media/cdrom0/RyokoHirosue/成长物语
    -d /media/cdrom0/RyokoHirosue/成长物语 音乐极限--成长物语.files
    -f /media/cdrom0/RyokoHirosue/成长物语  RH991101.mp3 
    -f /media/cdrom0/RyokoHirosue/成长物语  RH991102.mp3 
    

    其中 d代表目录;f代表文件

  • 虽然是自个儿随意设计的格式,但是小白可以体会出有以下好处:
    1. 格式自然,可以直接人工查阅
    2. 每行包含绝对必要的信息: 对象类型(目录?文件?), 所在目录,文件名
    3. 搜索匹配后输出行就是自然行,并包含必要信息
  • 那么其它数据格式快速考查一下:
  • Linux 目录摘要命令:ls -lR

    ~/LovelyPython/CDays/cday0$ ls -lR
    .:
    drwxr-xr-x 3 zoomq zoomq  4096 2007-08-18 22:43 apidocs
    -rwxr-xr-x 1 zoomq zoomq    87 2007-07-31 14:58 AUTHORS
    drwxr-xr-x 3 zoomq zoomq  4096 2007-07-31 14:58 cdc
    -rwxr-xr-x 1 zoomq zoomq  3874 2007-08-18 22:42 cdctools.py
    -rw-r--r-- 1 zoomq zoomq  3758 2007-08-18 22:42 cdctools.pyc
    -rwxr-xr-x 1 zoomq zoomq  1152 2007-08-18 22:02 ChangeLog
    -rw-r--r-- 1 zoomq zoomq   694 2007-08-18 22:30 epydoc.cfg
    -rwxr-xr-x 1 zoomq zoomq 35148 2007-08-18 22:00 LICENSE
    -rwxr-xr-x 1 zoomq zoomq   246 2007-08-18 22:01 PKG-INFO
    -rwxr-xr-x 1 zoomq zoomq  3273 2007-08-18 22:28 pycdc.py
    -rw-r--r-- 1 zoomq zoomq  4634 2007-08-18 22:28 pycdc.pyc
    -rwxr-xr-x 1 zoomq zoomq  1082 2007-07-31 14:58 README
    
    ./apidocs:
    -rw-r--r-- 1 zoomq zoomq   760 2007-08-18 22:52 api-objects.txt
    -rw-r--r-- 1 zoomq zoomq 15247 2007-08-18 22:52 cdctools-module.html
    -rw-r--r-- 1 zoomq zoomq 26380 2007-08-18 22:52 cdctools-pysrc.html
    -rw-r--r-- 1 zoomq zoomq  4139 2007-08-18 22:52 class-tree.html
    -rw-r--r-- 1 zoomq zoomq   340 2007-08-18 22:52 crarr.png
    ...
    
    • 是以空行来区分不同目录下的信息
    • 每节是固定顺序的信息:

      ./apidocs:  <-- 当前目录
      -rw-r--r-- 1 zoomq zoomq   760 2007-08-18 22:52 api-objects.txt
      ^   ^           ^   ^       ^   ^                   ^
      |   |           |   |       |   |                   +- 文件/目录名
      |   |           |   |       |   +- 创建/修订时间
      |   |           |   |       +- 体积
      |   |           |   +- 用户组
      |   |           +- 用户
      |   +- 权限组
      +- 文件(-)或是目录(d)
      
      • 包含了丰富且规范的信息,但是作为 PyCDC 其中有关时间/权限的信息都是不必要的,而且不是跨平台兼容的,在M$平台中,权限信息就根本用不上..
  • CD Catalog Expert的文本数据格式

    [Info]
    DriveType=5
    ImagePath=L:
    Volume=MCollec.39
    Serial=723840260
    FAT=CDFS
    DiskSize=676020224
    DiskFree=0
    
    [Comment]
    0= South Park(南方公园)
    1= 可儿乐队精选The Corrs Greathits
    2= 林忆莲
    3= 瘐澄庆《哈林天堂》Harlem'm 
    4=Heaven
    
    [L:]
    
    [L:\South Park(南方公园)]
    South Park - Merry Fucking Xmas.mp3=1986560
    South Park - Uncle Fucker.mp3=1056768
    
    ...
     
    • 嗬嗬嗬,这样儿的,小白也看明白了,完全是标准的.ini 配置文本格式哪!
    • [Info] 一节是软件和光盘整体信息
    • [Comment] 一节的是根目录列表
    • [目录] 各节是各个目录的文件信息
    • 和自创的文本格式相比是更加规范了些,而且可以直接由成熟的己有软件解读哪!
    • 小白突然开窃... 这等于是直接利用即有客户群哪! 有兼容性的话,原先使用 CD Catalog Expert 的人不也更加有可能使用 PyCDC 了?

    • 至于其它的使用数据库或是自创二进制文件的软件,小白没有精力和兴趣研究了,就这么着!

1.3. 快速重构

将PyCDC 的光盘摘要文本格式,直接向己有软件的数据格式看齐!

1.3.1. 问题探索

嗯嗯嗯,有了目标就有了研究的动力!

  • 小白立即根据分析结果确定了代码难点:
    1. 怎么处理 .ini 文件?
    2. 怎么获得文件的大小?
  • 老规矩,在列表中吼!
  • 结果,行者们给出来的答案是一致的:"内置模块有支持!"
  • 呜乎矣哉... 看来范了信赖病,小白重新拿起 提问的智慧 BS一下自个儿,

  • 然后,翻开Global Module Index -- 全局模块索引 ...这一大通乱找...果然!

1.3.1.1. ConfigParser

  • ConfigParser--配置处理机?! 这也忒直白了吧!

  • 粗略的看了一下,也就RawConfigParser-objects -- 原始配置处理机对象 有写出到文件的函式,就它了!

  • 在iPython 中快速尝试一下

图 CDay1-1 ConfigParser使用示意

  • 果然好使!

注意:: 
上图是截取真实的尝试过程,
不过由于笔者使用的是增强的Python 交互环境~iPython,
所以,在[14]处,可能有所误解,这里是使用tab ~制表符键时,iPython 自动给出的猜测输出,
以便用户选定/回忆出真正想要的对象/文件等等,并不是其它交互环境中使用 Enter ~ 回车键!
PCS2 iPython 分享了这一优秀的可以提高工作效率的环境体验!

详细:: 
PCS204 ConfigParser
进一步详细的分享了使用这一常用内建模块的技巧

1.3.1.2. 文件?是os 的

  • 文件大小信息... f开头的模块都不象哪...
  • 突然小白想起来,这文件和目录可都是文件系统,操作系统管理的哪
  • 光盘扫描的 walk() 函式就是在os 模块中的,文件这个信息也应该在的说?
  • Files and Directories -- 文及目录 ;果然! 有个 os.stat() 系统状态函式!

  • 照例 在 iPython 中快速尝试一下

图 CDay1-2 os.stat()使用示意

  • Bingo! 就它了!

详细:: 
PCS200 os
名为os 的内建模块中不仅仅有 stat()
还有其它大量的有关操作系统的好用工具!

1.3.2. 完成重构

简单的说就是将原先 os.walk() 生成的信息利用 基础配置处理机模块,组织成类ini 的文本保存下来:

   1 def cdWalker(cdrom,cdcfile):
   2     '''光盘扫描主函式
   3     @param cdrom: 光盘访问路径
   4     @param cdcfile: 输出的光盘信息记录文件(包含路径,绝对、相对都可以)
   5     @return: 无,直接输出成*.cdc 文件
   6     @attention: 从v0.7 开始不使用此扫描函式,使用 iniCDinfo()
   7     '''
   8     export = ""
   9     for root, dirs, files in os.walk(cdrom):
  10         print formatCDinfo(root,dirs,files)
  11         export+= formatCDinfo(root,dirs,files)
  12     open(cdcfile, 'w').write(export)
  13 
  14 def formatCDinfo(root,dirs,files):
  15     '''光盘信息记录格式化函式
  16     @note: 直接利用 os.walk() 函式的输出信息进行重组
  17     @param root: 当前根
  18     @param dirs: 当前根中的所有目录
  19     @param files: 当前根中的所有文件
  20     @return: 字串,组织好的当前目录信息
  21     '''
  22     export = "\n"+root+"\n"
  23     for d in dirs:
  24         export+= "-d "+root+_smartcode(d)+"\n"
  25     for f in files:
  26         export+= "-f %s %s \n" % (root,_smartcode(f))
  27     export+= "="*70
  28     return export

   1 def iniCDinfo(cdrom,cdcfile):
   2     '''光盘信息.ini格式化函式
   3     @note: 直接利用 os.walk() 函式的输出信息由ConfigParser.RawConfigParser进行重组处理成 .ini 格式文本输出并记录
   4     @param cdrom: 光盘访问路径
   5     @param cdcfile: 输出的光盘信息记录文件(包含路径,绝对、相对都可以)
   6     @return: 无,直接输出成组织好的类.ini 的*.cdc 文件
   7     '''
   8     walker = {}
   9     for root, dirs, files in os.walk(cdrom):
  10         walker[root]=(dirs,files)     # 这里是个需要理解的地方
  11     cfg = rcp()
  12     cfg.add_section("Info")
  13     cfg.add_section("Comment")
  14     cfg.set("Info", 'ImagePath', cdrom)
  15     cfg.set("Info", 'Volume', cdcfile)
  16     dirs = walker.keys()
  17     i = 0
  18     for d in dirs:
  19         i+=1
  20         cfg.set("Comment", str(i),d)
  21     for p in walker:
  22         cfg.add_section(p)
  23         for f in walker[p][1]:
  24             cfg.set(p, f, os.stat("%s/%s"%(p,f)).st_size)
  25     cfg.write(open(cdcfile,"w"))

注意: 
改进后函式第10行,应该理解到的是:
 使用字典保存目录结构信息;
 以根目录作为key(键),对应子目录加文件作为value(值);
 以便后续的处理,可以根据路径信息,自然的获得进一步的文件信息!并输出到文件的对应数据节中;
  • done! 当然还有连带的其它改动:
    1. 命令行相关响应的实际处理更新
    2. 搜索的相应升级
  • 嗬嗬嗬,都是小改动了,随手就得 ;)

1.4. 小结

在本日故事中,小白通过自发的反省,对比了数据结构的优劣,选择了对自个儿最容易理解,且跨平台通用的数据格式, 照例被行者提醒发觉并使用内建模块ConfigParser来进行数据文本的组织和解读; 至少可以体验到:

  1. 文本也是数据,结构化的文本不仅仅可以用来作配置文件,作为专门的数据库,也完全可以!
  2. os 模块包含了在操作系统中文件的所有主要操作

详细:: 
PCS208 dict4ini
实际上针对 .ini 格式文本数据,
行者曾经自定有相关模块,进行更加OOP 的操作!
dict4ini 就是其中一种第三方模块,
在 PCS208 中有相关描述,有兴趣的可以深入阅读;

1.5. 练习

  • (1) 编程实现以下功能并进行最大化的优化:遍历指定目录下的所有文件,找出其中占用空间最大的前3个文件。
  • (2) 利用ConfigParser,将上述题目中产生的结果按照cdays+1-my.ini格式存储到文件cdays+1-result.txt中。


::-- ZoomQuiet [2007-04-13 16:17:50]

Name Password4deL ;) :( X-( B-)
yeuwj tqbymrxn   qhjsgwv gsjvyhcpi fjgwuolrt lmzgna jmfraglv nyelsvfca jwzke
2008-08-23 23:02:19
X-( fyxcry   F4J1wN  <a href="http://llvrnkzgnzjd.com/">llvrnkzgnzjd</a>, [url=http://dushkxmnyqsl.com/]dushkxmnyqsl[/url], [link=http://wnppauddhlqa.com/]wnppauddhlqa[/link], http://yiozevootrar.com/
2008-09-08 05:44:18
:( xdglxbj   XObGNR  <a href="http://gfcrtqrypeyq.com/">gfcrtqrypeyq</a>, [url=http://zsqzkcnvgutt.com/]zsqzkcnvgutt[/url], [link=http://vrpfmlvewwmn.com/]vrpfmlvewwmn[/link], http://lqpfxiultjby.com/
2008-09-13 19:59:58
:( Bill   Word of Mouth is how people find my 300 ,
2008-09-14 09:06:44
:( rkizhurwtfi   ojP20y  <a href="http://mxiqlbqblmos.com/">mxiqlbqblmos</a>, [url=http://nxamtylccrja.com/]nxamtylccrja[/url], [link=http://zsevrejhunuz.com/]zsevrejhunuz[/link], http://jeqdrgjqxcek.com/
2008-09-17 22:19:28