status |
校对 |
100% |
1. CDay 1 优化!对自个儿的反省
~ 首次重构优化数据结构
没有最好,只有更合理!
1.1. 扩展需求
小白到现在已经实现的功能:
- 扫描光盘内容并存储为硬盘上的文本文件
存储成*.cdc 的文本文件 cdctools.cdWalker()
可以快速指定保存目录 PyCDC.do_dir()
可以快速指定保存的文件名 PyCDC.do_walk()
- 根据储存到硬盘上的光盘信息文件进行搜索
可以搜索指定目录中所有*.cdc文件 cdctools.cdcGrep()
可以指定关键字进行搜索 PyCDC.do_find()
- 列出所有含有关键字的信息行
而且,组织好了文档化的注释,足以让有心人快速了解整体程序结构,复用相关函式,或是掺合持续改进,这不真有另外的小白有了反馈
1.2. 问一声
为什么叫 PyCDC ? 和CD Catalog Expert 有关系嘛?
- 有好事者先置疑了名称...
- 原先随便起的名字,含义应该是 "CD Collector" 或是 "CD Commander",没有想到原来已经有同类甚至同名的软件了?
搜索一下 .... http://www.zero2000.com/cd-catalog-expert/index.html (精简地址:http://bit.ly/17N5fU)
嗯嗯嗯,还真有 CD Collection http://www.nicomsoft.com/cdc/ (精简地址:http://bit.ly/4vsuwe)
- 甚至于,原来类似通过抓取指定介质的信息进行外部管理的软件是一个大类,叫...PyCDC!
1.2.1. Disk Catalog
磁盘分类
找到的其中评比文章 http://tech.sina.com.cn/c/2003-12-05/25149.html (精简地址:http://bit.ly/3U8vbr)
- 而小白拍脑袋想出来的文本格式的光盘信息摘要形式,也是历史悠久:
完全类似象Total Commander的DiskDir, CatalogMaker 等插件生成的 Catalog摘要 一样
而在Linux 下面,自古FTP 服务器就提供通过ls -lR 生成的文本摘要
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代表文件
- 虽然是自个儿随意设计的格式,但是小白可以体会出有以下好处:
- 格式自然,可以直接人工查阅
- 每行包含绝对必要的信息: 对象类型(目录?文件?), 所在目录,文件名
- 搜索匹配后输出行就是自然行,并包含必要信息
- 那么其它数据格式快速考查一下:
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. 问题探索
嗯嗯嗯,有了目标就有了研究的动力!
- 小白立即根据分析结果确定了代码难点:
- 怎么处理 .ini 文件?
- 怎么获得文件的大小?
- 老规矩,在列表中吼!
- 结果,行者们给出来的答案是一致的:"内置模块有支持!"
呜乎矣哉... 看来范了信赖病,小白重新拿起 提问的智慧 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.4. 小结
在本日故事中,小白通过自发的反省,对比了数据结构的优劣,选择了对自个儿最容易理解,且跨平台通用的数据格式, 照例被行者提醒发觉并使用内建模块ConfigParser来进行数据文本的组织和解读; 至少可以体验到:
- 文本也是数据,结构化的文本不仅仅可以用来作配置文件,作为专门的数据库,也完全可以!
- 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]
| yeuwj tqbymrxn | qhjsgwv gsjvyhcpi fjgwuolrt lmzgna jmfraglv nyelsvfca jwzke |
2008-08-23 23:02:19 | ||
| 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 | ||