可爱的Python_模块篇.pdf
《可爱的Python_模块篇.pdf》由会员分享,可在线阅读,更多相关《可爱的Python_模块篇.pdf(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、模块篇|257 模块篇PCS200 os(.stat;.path)258PCS201 cmd 264PCS202 chardet 267PCS203 epydoc 270PCS204 ConfigParser 274PCS205 内建函式(enumerate)277PCS206 thread 280PCS207 threading 282PCS208 dict4ini 285PCS209 fnmatch 288PCS210 pickle 290PCS211 base64 294PCS212 shutil 298PCS213 time 304PCS214 ElementTree 309PCS21
2、5 random 312PCS216 socket 315PCS217 Tkinter 319258|Python学习作弊条PCS200 os(.stat;.path)概述os.path 是一个与平台无关的文件路径处理模块。它可以帮助我们解决在程序处理中碰到的一些复杂的路径处理问题,如“/”、“”、“”、“.”等路径分隔符处理不全面的问题,跨平台问题和组合一个可用的跨平台的路径地址问题。我们用简单的字符串拆分这些路径处理问题是很困难或者无法完成的,但是os.path都替你做好了解决方案,你只须使用它里面的函式就可以了。应用os.path.split os.path.split 的函式功能:os
3、拆分路径,返回一个tuple,第一个元素是文件所在路径,第二个元素是对应文件名。如下面的一个小测试:1 import os.path 2 3 for path in /one/two/three,4 /one/two/three/,5 /,模块篇|259 6 .,7 :8 print%s:%s%(path,os.path.split(path)对于一个文件(具有绝对路径或相对路径),使用 os.path.split()可以将其拆成对应路径名(不以路径分割符(如/结尾)和文件名;对于一个路径,则返回该路径(同样,不以路径分割符,(如/结尾),而对应的文件名为空。这里比较奇特的是对于当前文件夹(.
4、),os.path.split()把它看作是文件名。$python pcs-200-1.py /one/two/three:(/one/two,three)/one/two/three/:(/one/two/three,)/:(/,).:(,.):(,)os.path.basename os.path.basename 的函式功能:只获取某路径对应的文件名。修改上面的例子:1 import os.path 2 3 for path in /one/two/three,4 /one/two/three/,5 /,6 .,7 :8 print%s:%s%(path,os.path.basename
5、(path)如果这里的函式参数只是一个路径,不是文件名,则返回对应的文件名为空。同样对于.也比较奇怪。$python pcs-200-2.py /one/two/three:three/one/two/three/:/:.:.:260|Python学习作弊条os.path.dirname os.path.dirname的函式功能:只获取某路径对应的路径,不含文件名。再修改之前的例子:1 import os.path 2 3 for path in /one/two/three,4 /one/two/three/,5 /,6 .,7 :8 print%s:%s%(path,os.path.dir
6、name(path)同样,返回的路径名是不以路径分割符(如/)结尾的。$python pcs-200-3.py /one/two/three:/one/two/one/two/three/:/one/two/three/:/.:os.path.splitext os.path.splitext的函式功能:将路径、文件名、扩展名分开,并以一个tuple 的形式返回。1 import os.path 2 3 for path in filename.txt,filename,/path/to/filename.txt,/,:4 print%s:%path,os.path.splitext(path
7、)可以看到 os.path.splittext 只是很单纯地将文件名和扩展名分开了,如下所示。$python pcs-200-4.py filename.txt:(filename,.txt)filename:(filename,)/path/to/filename.txt:(/path/to/filename,.txt)/:(/,):(,)模块篇|261 monprefix monprefix 的函式功能:看一个比较cool 的功能就是要在一组路径中,找到一个共同的前缀,比如:1 import os.path 2 3 paths=/one/two/three/four,4 /one/two/
8、threefold,5 /one/two/three/,6 7 print paths 8 print monprefix(paths)$python pcs-200-5.py /one/two/three/four,/one/two/threefold,/one/two/three/one/two/three os.path.join os.path.join 的函式功能:使用os.path.join 组合一些零散的字符串,生成一个安全的路径表示,如下所示。1 import os.path 2 3 for parts in (one,two,three),4 (/,one,two,three
9、),5 (/one,/two,/three),6 :7 print parts,:,os.path.join(*parts)也就是将一系列短路径拼合成有效的长路径。$python pcs-200-6.py (one,two,three):one/two/three(/,one,two,three):/one/two/three(/one,/two,/three):/three os.path.expanduser os.path.expanduser的函式功能:可以利用 os.path.expanduser 寻找用户的 home 目录,如下262|Python学习作弊条所示。1 import
10、os.path 2 3 for user in ,root,mysql:4 lookup=+user 5 print lookup,:,os.path.expanduser(lookup)user是表示某个用户的home目录,表示当前用户的home目录。$python pcs-200-7.py :/home/shengyan root:/root mysql:/var/lib/mysql os.path.expandvars os.path.expandvars的函式功能:使用 os.path.expandvars来读取路径中系统环境变量的值。在下面的示例中,先使用os.environ 增加定
11、义了一个环境变量MYVAR,并为其赋值VALUE,然后使用 os.path.expandvars将出现在路径中的环境变量扩展为对应值。1 import os.path 2 import os 3 4 os.environMYVAR=VALUE 5 6 print os.path.expandvars(/path/to/$MYVAR)$python pcs-200-8.py /path/to/VALUE os.path.normpath os.path.normpath的函式功能:处理不规则路径字符串,将其转化为正常的路径。比如:1 import os.path 2 3 for path in
12、one/two/three,4 one/./two/./three,5 one/./one/two/three,6 :7 print path,:,os.path.normpath(path)模块篇|263$python pcs-200-9.py one/two/three:one/two/three one/./two/./three:one/two/three one/./one/two/three:one/two/three os.path.abspath os.path.abspath的函式功能:将相对路径转换为绝对路径,如下所示。1 import os.path 2 3 for pa
13、th in .,.,./one/two/three,./one/two/three:4 print%s:%s%(path,os.path.abspath(path)$python pcs-200-10.py .:/home/shengyan/LovelyPython/PCS/pcs-200.:/home/shengyan/LovelyPython/PCS./one/two/three:/home/shengyan/LovelyPython/PCS/pcs-200/one/two/three./one/two/three:/home/shengyan/LovelyPython/PCS/one/t
14、wo/three 问题要注意在两个根目录做join 操作时经常出现的问题,如下所示:1 import os 2 print os.path.join(/tmp,/var)执行结果为:/var 从结果中可以看到,并不是将两个路径做了简单连接,通过看help(os.path.join)可以看到,路径的拼接是从/开始的,所以会以“后一个开始/”为初始路径,要特别注意。探讨如果不使用 os.path这个模块,而是自己手工处理以上的例子,可以试试看需要如何处理,会遇到哪些困难。264|Python学习作弊条PCS201 cmd 概述cmd 模块为命令行接口(command-line interfaces
15、,CLI)提供了一个简单的框架。它经常被用在 pdb(Python 调试模块)模块中,当然也可以在自己的程序中使用它来创建命令行程序。应用下面先举个 cmd 模块使用的小例子:1#-*-coding:utf-8-*-2 import cmd 3 import string,sys 4 5 class CLI(cmd.Cmd):6 7 def _init_(self):8 cmd.Cmd._init_(self)9 self.prompt=#定义命令行提示符10 11 def do_hello(self,arg):#定义 hello命令所执行的操作12 print hello again,arg
16、,!13 14 def help_hello(self):#定义 hello命令的帮助输出模块篇|265 15 print syntax:hello message,16 print-prints a hello message 17 18 def do_quit(self,arg):#定义 quit命令所执行的操作19 sys.exit(1)20 21 def help_quit(self):#定义 quit命令的帮助输出22 print syntax:quit,23 print-terminates the application 24 25#定义 quit的快捷方式26 do_q=do_
17、quit 27 28#创建 CLI实例并运行29 cli=CLI()30 cli.cmdloop()从这个例子可以看出,首先 CLI 类继承了 cmd.Cmd 类,然后在类中定义了两条命令hello和 quit,而命令q 被作为quit 的短命令形式。也就是说,若须另外定义一条命令,如command,只要在CLI 类中增加一个do_command 函式,而该命令对应的帮助信息由help_command函式给出。使用cmd.Cmd类编写命令行处理程序是非常容易的。运行上述例子,可以进入如下的命令行:$python pcs-201.py?Documented commands(type help)
18、:=hello quit Undocumented commands:=help q help hello syntax:hello message-prints a hello message hello LovelyPython hello again LovelyPython!find*Unknown syntax:find q 266|Python学习作弊条就像示例中所写的那样,自定义的 CLI 类提供了hello和quit命令,可以正常使用它们,而find命令是没有定义的,所以命令行提示为未知语法。最后的q 命令和 quit 是一样的功能,即退出程序。小结使用 cmd 模块可以方便编
19、写命令行程序,同时使用getopt 和 optparse这两个模块可以很方便地解析命令行参数。这里向读者推荐一个比cmd 更好的模块,是由Doug Hellmann编写的命令行处理类CommandLineApp,具体可以访问以下网站:CommandLineApp 描述:http:/ 相关代码:http:/ PCS202 chardet 概述chardet是一个开源的字符编码自动检测模块,是基于 Python 实现的。读者可以在 chardet的网站上下载这个模块并根据源码包中的相关说明进行安装。chardet模块下载:http:/chardet.feedparser.org/download/
20、chardet-1.0.1.tgz 精巧地址:http:/bit.ly/8EXnf 应用检测字符编码利用 chardet 来自动检测字符编码的最简单方式是使用dectect(),它以一个非unicode 字符串作为参数,返回一个由被检测字符串的编码方式及其可信度数值(介于01 之间)组成的字典数据结构。下面的例子中,首先使用urllib.urlopen方法打开百度首页,并读取其内容作为被检测数据,然后使用chardet.detect检测并返回结果:import urllib rawdata=urllib.urlopen(http:/).read()import chardet chardet.
21、detect(rawdata)confidence:0.98999999999999999,encoding:GB2312 268|Python学习作弊条可以看到,检测出该网页编码方式GB2312 的可信度是 0.98999999999999999,一个非常高的值。渐进检测字符编码对于大量的文本,chardet 提供了可以渐进检测字符编码的相关方法,并且在满足可信度后会自动停止检测。具体是通过UniversalDetector 类的 feed 方法不断检测每个文本块,当达到最小可信度阈值时,就标记 UniversalDetector 类的 done 值为 True,表示完成检测。已经读取完待检
22、测文本之后若调用UniversalDetector 类的 close方法,它会在没有达到最小可信度的情况下再做一些计算,以便返回最大程度上准确的值,该值和chardet.detect函式是一样的字典结构。下面是一个例子:1 import urllib 2 from chardet.universaldetector import UniversalDetector 3 4 usock=urllib.urlopen(http:/)5 detector=UniversalDetector()6 for line in usock.readlines():7 detector.feed(line)8
23、 if detector.done:break 9 detector.close()10 usock.close()11 print detector.result 这个例子同样先打开百度首页,接着创建了一个UniversalDetector 对象 detector,在接下来的 for 循环中,读取数据的同时检测该数据,当 done 值为 True 时表示检测完成退出for循环,最后关闭数据流并打印结果:$python pcs-202-1.py confidence:0.98999999999999999,encoding:GB2312 如果想对多个独立文本进行编码检测,可以重复使用同一个Un
24、iversalDetector 对象,只要在每个文本开始检测前调用reset(),以表明接下来读取的是与之前文本相独立的字符串,然后就可以在类似上述例子中调用feed(),最后调用close()结束,最终的检测结果放在result 中,如下所示。1 import glob 2 from chardet.universaldetector import UniversalDetector 3 模块篇|269 4 detector=UniversalDetector()5 for filename in glob.glob(*.py):6 print filename.ljust(60),7 de
25、tector.reset()8 for line in file(filename,rb):9 detector.feed(line)10 if detector.done:break 11 detector.close()12 print detector.result 其运行结果如下:$python pcs-202-2.py pcs-202-1.py confidence:1.0,encoding:ascii pcs-202-2.py confidence:1.0,encoding:ascii 270|Python学习作弊条PCS203 epydoc 概述epydoc 是专门用于从源码注释
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可爱 Python_ 模块
限制150内