status

校对

ZoomQuiet; 100%

校对

bfishadow; 100%

1. CDay -4 可用的首个Python脚本

寻找吧!不要先想着创造 -- Python 是自足的

1.1. 现在的需求

嗯嗯嗯! 小白根据曾经下载过的几个类似商业软件名称, 给自个儿的软件起个名字: PyCDC -- Python制作的光盘收集器,或是命令工具--"CD Collector" 或是 "CD Commander"

再确认当前的需求
  1. 可以将光盘内容索引储存为硬盘上的文本文件
  2. 可以根据储存到硬盘上的光盘信息进行搜索

第一需求是将光盘信息读取为文本文件,因为小白痛恨数据库 (只能通过神奇的SQL语句才能调动数据库中的数据,太不直观,太不人性了!)

1.2. 文件是系统的事儿

现在首先的问题是 如何读取指定光区中的文件列表信息?

行者仅仅给了一点批示--文件是系统的事儿

1.2.1. listdir()

系统 -> 操作系统 -> operating system -> os模块

呜乎矣哉! 小白搜索了一大圈才弄明白,什么叫 系统 , 而且找到了相应的 模块

在简明 Python 教程--第14章 Python标准库 -- os模块 中看到一句话 ::

  • os.listdir()返回指定目录下的所有文件和目录名

详细: 
PCS200 含有
os模块进一步细节,
提及的:
在简明 Python 教程--第14章 Python标准库 在
http://www.woodpecker.org.cn/share/doc/abyteofpython_cn/chinese/ch14s03.html

看起来可以使用,所以,创建我们第一个执行脚本 CDay-4-1.py:

   1 # coding : utf-8
   2 import os
   3 print os.listdir("/media/cdrom0")

详细: 
PCS5 Python脚本文件
进一步说明了脚本文档在各种操作系统中的表现,
以及基础性的知识说明;

  • 解释:
    1. # coding : utf-8 应该作为八股文一样在每个脚本头部声明,这是个忠告-- 为了解决中文兼容问题的忠告, 同时你应该选择支持 Unicode 编码的编辑器环境,保证在运行脚本中的每个汉字都是使用 utf-8 编码过的...详细参考...

    2. import os 就是告诉 Python 环境,我们要使用 os模块, 以此类推,如果你想使用任何己有的模块包,就使用 import 模块名 的形式引用就好

    3. 最后一行才是我们真正想做的事儿:"打印光盘根路径中的所有文件和目录"
  • 脚本
    • 因为Python程序不用编译,人写的程序文件,可以直接执行,就象话剧脚本一样,所以也称 Python 程序文件为 脚本
    • 在交互式命令行环境中,固然可以立即获得执行结果,但是我们尝试过程中的各种程序代码无法记忆下来,所以,事先写好脚本使用运行命令 python 脚本名.py 的形式就可以反复执行我们的所有代码行

    • 这是Python 丰富的运行形式之一,也是最常用的一种
    运行结果类似:

图 CDay-4-1 使用脚本运行

当然在 iPython 环境下,逐步运行也一样

图 CDay-4-2 iPython中运行

详细: 
PCS2 详细说明了
加强的交互命令行界面iPython 的甜美;
简要的说 iPython 是Python 原生交互环境的加强,
追加了很多纯正Unix 风味的响应特性

以上截屏输出是使用 Ubuntu 6.06 安装光盘来测试的结果注1, 当然,小白使用进一步的目录时, os.listdir() 的确可以报告指定目录的所有信息,但是,问题是如何自动的将整个光盘的所有文件和目录信息都 一次性扫描 出来?

脚注:: 
Ubuntu 是最流行的GNU/Linux 发行版
官方网站是:
http://www.ubuntu.org.cn/
(需要补充logo)
笔者使用 Ubuntu 系统, 对于文件系统的使用和广大小白们使用 Windows 系统稍有不同"
  没有分区的概念,光盘一般会自动统一的挂接到 `/media/cdrom0` 目录,
  小白们,当然可以自由的使用 "G:\" 等等类似的盘符进行替换,
  放心 Python 足够聪明,她是跨平台的;)
再注意:
Windows 中最好使用 "d:\\" 进行分区的指定
否则,会出现类似:
d:/tmp\something 的混合输出

当然自个儿写一个也是可以的,不过是根据每级目录的信息,再次不断调用 os.listdir() 将所有层次的目录信息都逐一汇报出来而已,但是!值得嘛?

小白的热情是非常容易被貌似很麻烦的代码实现击碎的...于是热心的无所不能的行者们又提了句 :"使用walk()"

1.2.2. walk

又一阵乱搜, 发现居然有个单独的模块 os.path 就是进行文件路径处理的!

详细: 
PCS200 含有
os模块进一步细节,
其中 os.path() 函式的详细说明可以在线查询
http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/python/lib/module-os.path.html

再一通E文后发现:

  Note: The newer os.walk() generator supplies similar functionality and can be easier to use.

详细:: 
PCS4 常用自省
在那里详细介绍了最最常用的几个Python 内建函式,
可以通过自省的方式来快速对Python 自个儿查询,
寻找想要的处理支持;

好象在我们的环境中有两个 walk() -- os.path.walk() 以及 os.walk() ,后一个更加新以及好用?

按照 os-file-dir 的示例改造脚本尝试 CDay-4-2.py :

   1 # coding : utf-8
   2 import os
   3 for root, dirs, files in os.walk('/media/cdrom0'):
   4   print root,dirs,files

按照脚本运行方式尝试:$ python CDay-4-2.py... 哇!一下子输出了一大堆的东西! 嗯嗯嗯!看来管用,应该是将整个光盘的文件/目录信息都扫描出来了,

详细: 
PCS200 含有
os模块进一步细节,
其中 os-file-dir 可以在线查阅:
http://aspn.activestate.com/ASPN/docs/ActivePython/2.4/python/lib/os-file-dir.html

详细: 
PCS102 for循环
进一步说明小白首次遇见的新语法现象;
也是一切程序中最基本的反复运行相似语句的技巧;

先不管三七二十一,保存为文件先!

1.2.3. 输出成文件

小白,根据行者指引,或是搜索,都指向 file_objects文件对象操作, 加点儿想象就可以组成以下脚本 CDay-4-3.py:

   1 # coding : utf-8
   2 import os
   3 for root, dirs, files in os.walk('/media/cdrom0'):
   4   open('mycd.cdc', 'a').write(root+dirs+files)

详细: 
PCS200 含有
os模块进一步细节,
其中 file_objects 可以在线查阅:
http://www.woodpecker.org.cn/diveintopython/file_handling/file_objects.html

执行尝试 $python CDay-4-3.py

图 CDay-4-3 初步CDay-4-3.py脚本运行结果

完了!报错!...小白感觉信心又降到冰点了; "嗬嗬嗬",行者说:"不用担心,在Python 中的解决bug 是非常轻松的,因为完善的回溯能力,Python 可以非常精确的汇报小白错误的时间,地点,原因,我们只要对应修订就好."

现在的问题是:

 `TypeError: cannot concatenate 'str' and 'list' objects` 
 -- 不能将 '''str''' 和 '''list''' 对象进行连接; 

嗯嗯嗯,非常直白的数据类型错误,

什么是 数据类型? -- 嗯嗯嗯,这问题可以复杂说也可以简单说,复杂的说,并不能帮助小白们理解和记忆,简单的说也不一定可以加深印象; 通俗的讲呢,就是计算机内存空间中不同的种族,好比鸡鸭同笼,长的都挺像,但是没有办法买相同的价钱,除非都剁碎了炸成春卷 -- 也就是说只要发生类似数据类型不同的时候,只要转换成相同的类型就得!

这在其它语言可能会很麻烦但是在Python 中是再自然不过的了--因为,Python 里一切都是对象 注2

脚注:: 
这是理解,应用Python 的关键句之一,详细的参考:
万物皆对象
http://www.woodpecker.org.cn/diveintopython/getting_to_know_python/everything_is_an_object.html

讨教行者,给了个样例:

  print "%s %s %s %s" % ("字串",["数","组"],("元","组"),{'字典':123})

如果有C编程经验的小白就立即可以联想到这是输出格式化的技巧, 使用%s 的格式化声明,要求后面的对象以 String 字串的格式进行转换,所以脚本 CDay-4-4.py 的改造也就顺理成章了 :

   1 # coding : utf-8
   2 import os
   3 for root, dirs, files in os.walk('/media/cdrom0'):
   4   open('mycd.cdc', 'a').write("%s %s %s" % (root,dirs,files))
注解
  1. 声明是 utf-8 编码文本
  2. 引入 os 模块
  3. 使用 os.walk() 扫描光盘,并返回三个对象
  4. 使用open()打开'mycd.cdc'文件对象,并声明成追加模式,逐行记录以上三个对象

不用怀疑,执行没有报错,而且文件也生成,但是为什么打不开? ... 嗬嗬嗬,那是另一个问题了...

2. 小结

通过指点,在文档中狂乱的搜寻,今天小白顺利的将光盘信息全部扫描出来,并存储成了文件!

最后得到的仅仅四行,真正运行可用的就两行代码,就居然已经可以达到想要的软件功能的50%...嗬嗬嗬,神奇的Python不是?

小白其实已经接触到了一大批概念:

  1. 模块 -- import os

  2. 内置函式 -- open()

  3. 循环 --  for ... in ... 

  4. 块界定符

  5. 注释符

  6. 对象

  7. 文件对象

  8. 对象转换

  9. 格式化声明 -- %s

  10. 数据类型

但是都包含在了四行代码中,而我们的原则是,先用后学,快速获得体验,然后寻求理论支持,所以,先不求甚解,将目的达到,然后就自在了

详细:: 
涉及知识点的进一步信息请查阅对应作弊条:
PCS100 import 说明引入模块的技巧
PCS205 内建函式 介绍一些最常用的内建函式
PCS102 for 循环 介绍最常用的循环体
PCS103 缩进 阐述了Python 最大的特点~使用缩进来区分语法单位
PCS104 注释 介绍了Python 式的注释方式
PCS105 对象 介绍了Python 中的一等公民
PCS106 文件对象 介绍了最常用的对外交互渠道~文件,及其处置对象
PCS107 字串格式化 介绍了Python 内置的字符模板支持特性
PCS101 内建数据类型 介绍了动态语言的最大便利~自由类型转换的体验

2.1. 练习

  • (1) os 模块中还有哪些功能可以使用? -- 提示使用 dir()和help()
  • (2) open() 还有哪些模式可以使用?
  • (3) 尝试for .. in ..循环可以对哪些数据类型进行操作?
  • (4) 格式化声明,还有哪些格式可以进行约定?
  • (5) 现在的写入文件模式好嘛? 有改进的余地?

CDay-4-5.py 好在哪里? :

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

CDay-4-6.py又更加好在哪里? :

   1 # coding : utf-8
   2 import os
   3 export = []
   4 for root, dirs, files in os.walk('/media/cdrom0'):
   5     export.append("\n %s;%s;%s" % (root,dirs,files))
   6 open('mycd2.cdc', 'w').write(''.join(export))
  • (6) 读取文件cdays-4-test.txt内容,去除空行和注释行后,以行为单位进行排序,并将结果输出为cdays-4-result.txt。
    • cdays-4-test.txt~

      #some words
      Sometimes in life,
      You find a special friend;
      Someone who changes your life just by being part of it.
      Someone who makes you laugh until you can't stop;
      Someone who makes you believe that there really is good in the world.
      Someone who convinces you that there really is an unlocked door just waiting for you to open it.
      
      This is Forever Friendship.
      when you're down,
      and the world seems dark and empty,
      Your forever friend lifts you up in spirits and makes that dark and empty world
      suddenly seem bright and full.
      Your forever friend gets you through the hard times,the sad times,and the confused times.
      If you turn and walk away,
      Your forever friend follows,
      If you lose you way,
      Your forever friend guides you and cheers you on.
      Your forever friend holds your hand and tells you that everything is going to be okay. 
      

Name Password4deL
ebcqknsl uynejxqb   jthesk xuosrijve cjpgu pxwf pefgndwlv nfvhw yioelz
2008-05-09 07:29:47
bzujfcx qlsucnoby   wkzpvgj mbyucqn fbetcdu tyrdlsb fcsg zwpievb wrlyi http://www.yvglzfx.hpuyxtwdn.com
2008-05-09 07:32:26
wagxchud kaotjnsh   qxynsbafr bvhg rspzauhcf urlhi huyn bowps diabkmfl [URL=http://www.dnhzvbc.dfutis.com]gciexfbok wacxmr[/URL]
2008-05-09 07:33:05
bfishadow   done. defects reported.
2008-07-24 21:29:08
lvigwc   C8Se7x  <a href="http://krxdbgtkikjy.com/">krxdbgtkikjy</a>, [url=http://eeaxatacguta.com/]eeaxatacguta[/url], [link=http://sqcwifdajusx.com/]sqcwifdajusx[/link], http://radxemueujse.com/
2008-07-30 15:55:18

-- ZoomQuiet [2007-02-20 07:11:54]

  • 1 转脚注

  • 2 转用脚注