Chapter 6. 模块
Table of Contents
6.1. String模块
6.2.
time模块
模块可把一个复杂的程序按功能分开,分别存放到不同文件中,使程序更容易维护和管理。在Python中的模块是一个以.py结尾的Python代码文件。可通过import命令输入,如:import sys
import会完成以下三个操作:
创建新的名称空间(namespace),该名称空间中拥有输入模块中定义的所有对象;
执行模块中的代码;
创建该名称空间的变量名。
import语句可同时输入多个模块,如:import os,sys,system
也可写成:import osimport sysimport system
有些模块的名称很长,我们可在输入时给它起个简单的别名,这样在使用模块中的对象就方便很多,如:import ftplib as ftp
有时我们可能只想使用模块中某个对象,又不想把整个模块输入,则可以用from...import语句输入特定对象。如:from ftplib import FTP
这样,我们就可直接使用FTP(),而不用带前缀。
如果装载模块出错,会引发ImportError异常。我们可捕获该异常进行相应处理。
Python脚本和模块都是一个以.py结束的文件,那程序是如何判断一个.py文件是作为脚本还是模块呢?关键是一个名为__name__的变
量,如果它的值是__main__,则不能作为模块,只能作为脚本直接运行。所以在很多脚本的最后都有一段类似下面的语句,限制只能以脚本方式运行,不作
为模块:if __name__ == '__main__': main()
几个功能相近的模块我们可组成一个Python包,存放到一个目录结构中,通过输入包的路径来调用对象。要定义包,就要建一个与包名同名的目录,接
着在该目录下创建__init__.py文件。该文件是包的初始化文件,可以为空,也可定义一个代码。例如一个WebDesign包的目录如下:/WebDesign __init_.py design.py draw.py ...
我们可通过以下语句输入design模块:import WebDesign.design
6.1. String模块
replace(string,old,new[,maxsplit])
字符串的替换函数,把字符串中的old替换成new。默认是把string中所有的old值替换成new值,如果给出maxsplit值,还可控制替换的个数,如果maxsplit为1,则只替换第一个old值。>>>a="11223344">>>print string.replace(a,"1","one")oneone2223344>>>print string.replace(a,"1","one",1)one12223344
capitalize(string)
该函数可把字符串的首个字符替换成大字。>>> import string>>> print string.capitalize("python")Python
split(string,sep=None,maxsplit=-1)
从string字符串中返回一个列表,以sep的值为分界符。>>> import string>>> ip="192.168.3.3">>> ip_list=string.split(ip,'.')>>> print ip_list['192', '168', '3', '3']
join(string[,sep])
返回用sep连接的字串,默认的sep是空格。>>> import string>>> a = ['a','b','c']>>> b = string.join(a,'-')>>> b'a-b-c'>>> a['a', 'b', 'c']
6.2. time模块
内置模块time包含很多与时间相关函数。我们可通过它获得当前的时间和格式化时间输出。
time(),以浮点形式返回自Linux新世纪以来经过的秒数。在linux中,00:00:00 UTC, January 1,
1970是新纪元的开始。>>> time.time()1150269086.6630149>>> time.ctime(1150269086.6630149)>>> 'Wed Jun 14 15:11:26 2006'
ctime([sec]),把秒数转换成日期格式,如果不带参数,则显示当前的时间。>>> import time>>> time.ctime()>>> 'Wed Jun 14 15:02:50 2006'>>> time.ctime(1138068452427683)'Sat Dec 14 04:51:44 1901'
sleep(secs),定时。>>> time.sleep(10) >>> #10秒后才会出现>>>提示符
Chapter 7. 类
类是面向对象编程的一个重要概念。通过类的创建和继承,可重用代码,减少代码复杂度。Python是一种面向对象的脚本语言,用class语句可创建类,语法规则如下:class classnmae([class_parent,...]): ... def method(): ......
一个例子:#!/usr/bin/python#-*- encoding:utf-8 -*-class test: #定义一个test类 desc = "这是一个测试类。" #在类中定义一个属性desc def __init__(self,name1): #对象构造函数,初始化类 self.name1 = name1 def show(self,name2): #在类中定义一个方法show() print "hello world" print 'name1:',self.name1 print 'name2:',name2instance = test('这是传递给name1的值') #生成test类的实例对象instanceprint instance.desc #调用类中的desc属性instance.show('这是传递给name2的值') #调用类中的show()方法
把该脚本命名为test.py,并用chmod +x test.py使脚本有执行的权限 ,运行该脚本结果如下:debian:~/python# ./test.py这是一个测试类。hello worldname1: 这是传递给name1的值name2: 这是传递给name2的值
这里只是Python语言中类的一个简单介绍。详细介绍可参考网站上自由文档栏目中的Python资料。
Chapter 8. 异常处理
Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。异常处理的try语法有两种,一种是:try: blockexcept [exception,[data...]]: blockelse: block
该种异常处理语法的规则是:
执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
如果没有发生异常,则执行else块代码。
try语句的第二种语法是:try: blockfinally: block
该语句的执行规则是:
执行try下的代码。
如果发生异常,在该异常传递到下一级try时,执行finally中的代码。
如果没有发生异常,则执行finally中的代码。
第二种try语法在无论有没有发生异常都要执行代码的情况下是很有用的。例如我们在python中打开一个文件进行读写操作,我在操作过程中不管是否出现异常,最终我都是要把该文件关闭的。
除了系统引发的异常外,我们还可用raise语句手工引发一个异常:raise [exception[,data]]
Chapter 9. 文件处理
Table of Contents
9.1. 文件处理的函数和方法
9.2. 示例
文件是我们储存信息的地方,我们经常要对文件进行读、写、删除等的操作,在Python中,我们可用Python提供的函数和方法方便地操作文件。
9.1. 文件处理的函数和方法
使用Open()函数可打开文件,语法格式如下:file_handler = open(filename,[,mode[,bufsize]]
filename是你要操作的文件名,如果不在当前路径,需指出具体路径。mode是打开文件的模式,表示你要如何操作文件,bufsize表示是否使用缓存。
Table 9.1. mode
模式
描述
r
以读方式打开文件,可读取文件信息。
w
以写方式打开文件,可向文件写入信息。
a
以追加方式打开文件,文件指针自动移到文件尾。
r+
以读写方式打开文件,可对文件进行读和写操作。
w+
消除文件内容,然后以读写方式打开文件。
a+
以读写方式打开文件,并把文件指针移到文件尾。
b
以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。
Table 9.2. bufsize
bufsize取值
描述
0
禁用缓冲
1
行缓冲
>1
指定缓冲区的大小
<1
系统默认的缓冲区大小
open()函数返回一个文件对象,我们可通过read()或write()函数对文件进行读写操作,下面是一些文件对象方法:
Table 9.3. 文件对象方法
方法
描述
f.close()
关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。
f.fileno()
获得文件描述符
f.flush()
刷新输出缓存
f.isatty()
如果文件是一个交互终端,则返回True,否则返回False。
f.read([count])
读出文件,如果有count,则读出count个字节。
f.readline()
读出一行信息。
f.readlines()
读出所有行,也就是读出整个文件的信息。
f.seek(offset[,where])
把文件指针移动到相对于where的offset位置。offset为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。
f.tell()
获得文件指针位置。
f.truncate([size])
截取文件,使文件的大小为size。
f.write(string)
把string字符串写入文件。
f.writelines(list)
把list中的字符串一行一行地写入文件。
9.2. 示例
文件的打开或创建#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler = open('test.txt','w') #以写模式打开文件,如果文件不存在则创建filehandler.write('this is a file open/create test.\nthe second line.')filehandler.close()#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler = open('test.txt','a') #以追加模式打开文件,如果文件不存在则创建filehandler.write('\nappend the text in another line.\n')filehandler.close()
读取文件#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler = open('test.txt','r') #以读方式打开文件,rb为二进制方式(如图片或可执行文件等) print 'read() function:' #读取整个文件print filehandler.read() print 'readline() function:' #返回文件头,读取一行filehandler.seek(0)print filehandler.readline() print 'readlines() function:' #返回文件头,返回所有行的列表filehandler.seek(0)print filehandler.readlines() print 'list all lines' #返回文件头,显示所有行filehandler.seek(0)textlist = filehandler.readlines()for line in textlist: print lineprint 'seek() function' #移位到第32个字符,从33个字符开始显示余下内容filehandler.seek(32)print filehandler.read()print 'tell() function' #移位到文件头,从头开始显示2位字符filehandler.seek(0)print filehandler.readline() #显示第一行内容print filehandler.tell() #显示当前位置print filehandler.readline() #显示第二行内容print filehandler.read() #显示余下所有内容filehandler.close() #关闭文件句柄
文件系统操作#!/usr/bin/env python#-*- encoding:utf-8 -*-import os,fnmatch,globfor fileName in os.listdir ( '/root' ): #列出/root目录内容,不包括.和.. print fileName os.mkdir('py') #在当前目录下创建一个py目录,且只能创建一层os.rmdir( 'py') #在当前目录下删除py目录,且只能删除一层os.makedirs('py/aa') #可创建多层目录os.removedirs('py/aa') #可删除多层目录print 'demonstration fnmatch module' for fileName in os.listdir ( '/root/python/file' ): if fnmatch.fnmatch(fileName,'*.txt'): #利用UNIX风格的通配,只显示后缀为txt的文件 print fileNameprint 'demonstration glob module'for fileName in glob.glob ( '*.txt' ): #利用UNIX风格的通配,只显示后缀为txt的文件 print fileName
获取文件状态#!/usr/bin/env python#-*- encoding:UTF-8 -*-import os,time,statfileStats = os.stat ( 'test.txt' ) #获取文件/目录的状态fileInfo = {'Size':fileStats [ stat.ST_SIZE ], #获取文件大小'LastModified':time.ctime( fileStats [ stat.ST_MTIME ] ), #获取文件最后修改时间'LastAccessed':time.ctime( fileStats [ stat.ST_ATIME ] ), #获取文件最后访问时间'CreationTime':time.ctime( fileStats [ stat.ST_CTIME ] ), #获取文件创建时间'Mode':fileStats [ stat.ST_MODE ] #获取文件的模式}#print fileInfofor field in fileInfo: #显示对象内容 print '%s:%s' % (field,fileInfo[field])#for infoField,infoValue in fileInfo:# print '%s:%s' % (infoField,infoValue)if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ): #判断是否路径 print 'Directory. 'else: print 'Non-directory.'if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ): #判断是否一般文件 print 'Regular file.'elif stat.S_ISLNK ( fileStats [ stat.ST_MODe ] ): #判断是否链接文件 print 'Shortcut.'elif stat.S_ISSOCK ( fileStats [ stat.ST_MODe ] ): #判断是否套接字文件 print 'Socket.'elif stat.S_ISFIFO ( fileStats [ stat.ST_MODe ] ): #判断是否命名管道 print 'Named pipe.'elif stat.S_ISBLK ( fileStats [ stat.ST_MODe ] ): #判断是否块设备 print 'Block special device.'elif stat.S_ISCHR ( fileStats [ stat.ST_MODe ] ): #判断是否字符设置 print 'Character special device.'#!/usr/bin/env python#-*- encoding:UTF-8 -*-import os.pathfileStats = 'test.txt'if os.path.isdir ( fileStats ): #判断是否路径 print 'Directory.'elif os.path.isfile ( fileStats ): #判断是否一般文件 print 'File.'elif os.path.islink ( fileStats ): #判断是否链接文件 print 'Shortcut.'elif os.path.ismount ( fileStats ): #判断是否挂接点 print 'Mount point.'
stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义。我们可方便地根据stat模块存取os.stat()中的值。
串行化文件#!/usr/bin/env python#-*- encoding:UTF-8 -*-import picklefilehandler = open('pickle.txt','w')text = ['this is a pickle demonstrate','aa','bb']pickle.dump(text,filehandler) #把text的内容序列化后保存到pickle.txt文件中filehandler.close()filehandler2 = open('pickle.txt')textlist = pickle.load(filehandler2) #还原序列化字符串print textlistfilehandler2.close()#cpickle是用C写的pickle模块,比标准的pickle速度快很多,使用方法同pickle。
内存文件#!/usr/bin/env python#-*- coding: utf-8 -*-import StringIOfileHandle = StringIO.StringIO ( "Let freedom ring." ) #create file in memoryprint fileHandle.read() # "Let freedom ring."fileHandle.close()#cStringIO是用C写的StringIO模块,执行速度比StringIO快。
shutil模块是一个高级的文件处理模块,可实现文件的拷贝、删除等操作。
Chapter 10. 正则表达式
Table of Contents
10.1. 基本元素
10.2. 操作
正则表达式是一个很有用的工具,可处理复杂的字符匹配和替换工作。在Python中内置了一个re模块以支持正则表达式。
正则表达式有两种基本的操作,分别是匹配和替换。
匹配就是在一个文本字符串中搜索匹配一特殊表达式;
替换就是在一个字符串中查找并替换匹配一特殊表达式的字符串。
10.1. 基本元素
正则表达式定义了一系列的特殊字符元素以执行匹配动作。
Table 10.1. 正则表达式基本字符
字符
描述
text
匹配text字符串
.
匹配除换行符之外的任意一个单个字符
^
匹配一个字符串的开头
$
匹配一个字符串的末尾
在正则表达式中,我们还可用匹配限定符来约束匹配的次数。
Table 10.2. 匹配限定符
最大匹配
最小匹配
描述
*
*?
重复匹配前表达式零次或多次
+
+?
重复匹配前表达式一次或多次
?
??
重复匹配前表达式零次或一次
{m}
{m}?
精确重复匹配前表达式m次
{m,}
{m,}?
至少重复匹配前表达式m次
{m,n}
{m,n}?
至少重复匹配前表达式m次,至多重复匹配前表达式n次
据上所述,".*"为最大匹配,能匹配源字符串所有能匹配的字符串。".*?"为最小匹配,只匹配第一次出现的字符串。如:d.*g能匹配任意以d开头,以g结尾的字符串,如"debug"和"debugging",甚至"dog
is walking"。而d.*?g只能匹配"debug",在"dog is walking"字符串中,则只匹配到"dog "。
在一些更复杂的匹配中,我们可用到组和运算符。
Table 10.3. 组和运算符
组
描述
[...]
匹配集合内的字符,如[a-z],[1-9]或[,./;']
[^...]
匹配除集合外的所有字符,相当于取反操作
A|B
匹配表达式A或B,相当于OR操作
(...)
表达式分组,每对括号为一组,如([a-b]+)([A-Z]+)([1-9]+)
\number
匹配在number表达式组内的文本
有一组特殊的字符序列,用来匹配具体的字符类型或字符环境。如\b匹配字符边界,food\b匹配"food"、"zoofood",而和"foodies"不匹配。
Table 10.4. 特殊字符序列
字符
描述
\A
只匹配字符串的开始
\b
匹配一个单词边界
\B
匹配一个单词的非边界
\d
匹配任意十进制数字字符,等价于r'[0-9]'
\D
匹配任意非十进制数字字符,等价于r'[^0-9]'
\s
匹配任意空格字符(空格符、tab制表符、换行符、回车、换页符、垂直线符号)
\S
匹配任意非空格字符
\w
匹配任意字母数字字符
\W
匹配任意非字母数字字符
\Z
仅匹配字符串的尾部
\\
匹配反斜线字符
有一套声明(assertion)对具体事件进行声明。
Table 10.5. 正则表达式声明
声明
描述
(?iLmsux)
匹配空字符串,iLmsux字符对应下表的正则表达式修饰符。
(?:...)
匹配圆括号内定义的表达式,但不填充字符组表。
(?P<name>)
匹配圆括号内定义的表达式,但匹配的表达式还可用作name标识的符号组。
(?P=name)
匹配所有与前面命名的字符组相匹配的文本。
(?#...)
引入注释,忽略圆括号内的内容。
(?=...)
如果所提供的文本与下一个正则表达式元素匹配,这之间没有多余的文本就匹配。这允许在一个表达式中进行超前操作,而不影响正则表达式其余部分的分析。如"Martin"其后紧跟"Brown",则"Martin(?=Brown)"就只与"Martin"匹配。
(?!...)
仅当指定表达式与下一个正则表达式元素不匹配时匹配,是(?=...)的反操作。
(?<=...)
如果字符串当前位置的前缀字符串是给定文本,就匹配,整个表达式就在当前位置终止。如(?<=abc)def表达式与"abcdef"匹配。这种匹配是对前缀字符数量的精确匹配。
(?<!...)
如果字符串当前位置的前缀字符串不是给定的正文,就匹配,是(?<=...)的反操作。
正则表达式还支持一些处理标志,它会影响正则式的执行方法。
Table 10.6. 处理标志
标志
描述
I或IGNORECASE
忽略表达式的大小写来匹配文本。
10.2. 操作
通过re模块,我们就可在python中利用正则式对字符串进行搜索、抽取和替换操作。如:re.search()函数能执行一个基本的搜索操作,它能返回一个MatchObject对象。re.findall()函数能返回匹配列表。>>> import re>>> a="this is my re module test">>> obj = re.search(r'.*is',a)>>> print obj<_sre.SRE_Match object at 0xb7d7a218>>>> obj.group()'this is'>>> re.findall(r'.*is',a)['this is']
MatchObject对象方法
Table 10.7. MatchObject对象方法
方法
描述
expand(template)
展开模板中用反斜线定义的内容。
m.group([group,...])
返回匹配的文本,是个元组。此文本是与给定group或由其索引数字定义的组匹配的文本,如果没有组定组名,则返回所有匹配项。
m.groups([default])
返回一个元组,该元组包含模式中与所有组匹配的文本。如果给出default参数,default参数值就是与给定表达式不匹配的组的返回值。default参数的默认取值为None。
m.groupdict([default])
返回一个字典,该字典包含匹配的所有子组。如果给出default参数,其值就是那些不匹配组的返回值。default参数的默认取值为None。
m.start([group])
返回指定group的开始位置,或返回全部匹配的开始位置。
m.end([group])
返回指定group的结束位置,或返回全部匹配的结束位置。
m.span([group])
返回两元素组,此元组等价于关于一给定组或一个完整匹配表达式的(m.start(group),m.end(group)))列表
m.pos
传递给match()或search()函数的pos值。
m.endpos
传递给match()或search()函数的endpos值。
m.lastindex
m.lastgroup
m.re
创建这个MatchObject对象的正则式对象
m.string
提供给match()或search()函数的字符串。
使用sub()或subn()函数可在字符串上执行替换操作。sub()函数的基本格式如下:sub(pattern,replace,string[,count])
示例>>> str = 'The dog on my bed'>>> rep = re.sub('dog','cat',str)>>> print repThe cat on my bed
replace参数可接受函数。要获得替换的次数,可使用subn()函数。subn()函数返回一个元组,此元组包含替换了的文本和替换的次数。
如果需用同一个正则式进行多次匹配操作,我们可把正则式编译成内部语言,提高处理速度。编译正则式用compile()函数来实现。compile()函数的基本格式如下:compile(str[,flags])
str表示需编译的正则式串,flags是修饰标志符。正则式被编译后生成一个对象,该对象有多种方法和属性。
Table 10.8. 正则式对象方法/属性
方法/属性
描述
r.search(string[,pos[,endpos]])
同search()函数,但此函数允许指定搜索的起点和终点
r.match(string[,pos[,endpos]])
同match()函数,但此函数允许指定搜索的起点和终点
r.split(string[,max])
同split()函数
r.findall(string)
同findall()函数
r.sub(replace,string[,count])
同sub()函数
r.subn(replace,string[,count])
同subn()函数
r.flags
创建对象时定义的标志
r.groupindex
将r'(?Pid)'定义的符号组名字映射为组序号的字典
r.pattern
在创建对象时使用的模式
转义字符串用re.escape()函数。
通过getattr获取对象引用
>>> li=['a','b']>>> getattr(li,'append')>>> getattr(li,'append')('c') #相当于li.append('c')>>> li['a', 'b', 'c']>>> handler=getattr(li,'append',None)>>> handler<built-in method append of list object at 0xb7d4a52c>>>> handler('cc') #相当于li.append('cc')>>> li['a','b','c','cc']>>>result = handler('bb')>>>li['a','b','c','cc','bb']>>>print resultNone
Chapter 11. 调试
Python自带了一个调试器叫pdb,和Gnu的gbd类似。下面用一个简单的程序来演示pdb的功能。程序代码如下:#!/usr/bin/pythonimport pdba = "aaa"pdb.set_trace()b = "bbb"c = "ccc"final = a + b + cprint final
该程序已导入pdb模块,并在代码中添加的pdb.set_trace()跟踪点。现在让我们来运行该程序。localhost:~/python/pdb# python pdbtest.py--Return--> /usr/lib/python2.3/pdb.py(992)set_trace()->None-> Pdb().set_trace() # 从跟踪点开始执行(Pdb) n # n 读入下一行代码> /root/python/pdb/pdbtest.py(6)?()-> b = "bbb"(Pdb) n> /root/python/pdb/pdbtest.py(7)?()-> c = "ccc"(Pdb) p b # p 打印变量值'bbb'(Pdb) l # l 显示当前执行位置 2 3 import pdb 4 a = "aaa" 5 pdb.set_trace() 6 b = "bbb" 7 -> c = "ccc" 8 final = a + b + c 9 print final 10[EOF](Pdb) n > /root/python/pdb/pdbtest.py(8)?()-> final = a + b + c(Pdb) n # 如果命令和上次的一样,也可直接按回车,不用输入'n' > /root/python/pdb/pdbtest.py(9)?()-> print final(Pdb) naaabbbccc--Return--> /root/python/pdb/pdbtest.py(9)?()->None-> print final(Pdb) p a,b,c,final('aaa', 'bbb', 'ccc', 'aaabbbccc')(Pdb)('aaa', 'bbb', 'ccc', 'aaabbbccc')(Pdb) nlocalhost:~/python/pdb# # 返回shell
pdb还有很多命令,用help命令就可以列出所有的pdb命令,用help p可以查询p命令的说明。
Chapter 12. HOW-TO
本章内容记录Python的一些小技巧小知识。来源是网上摘录或自己学习所得。
如何判断操作系统类型import sysprint sys.platformprint sys.version
显示和修改python的Module搜索路径>>> import sys>>> print sys.path['', '/usr/lib/python23.zip', '/usr/lib/python2.3', '/usr/lib/python2.3/plat-linux2', '/usr/lib/python2.3/lib-tk', '/usr/lib/python2.3/lib-dynload', '/usr/local/lib/python2.3/site-packages', '/usr/lib/python2.3/site-packages']>>> sys.path.append('/usr/lib/mypath')>>> print sys.path['', '/usr/lib/python23.zip', '/usr/lib/python2.3', '/usr/lib/python2.3/plat-linux2','/usr/lib/python2.3/lib-tk', '/usr/lib/python2.3/lib-dynload', '/usr/local/lib/python2.3/site-packages', '/usr/lib/python2.3/site-packages', '/usr/lib/mypath']
把列表转换成字符串>>> t=['a','b','c']>>> print t['a', 'b', 'c']>>> import string>>> print string.join(t)a b c
运行系统程序>>>import os>>>os.system('ls') #用os.system()可执行系统命令>>>exec "os.system('ls')" #用exec可执行字符串中的命令,两个命令的效果一样。
以上两个命令的输出都是直接显示在屏幕上,不能保存到变量中,如果我们要把输出保存起来,可用os.pope\ n()函数。>>>cmd = '/usr/bin/mkntpwd %s' % password>>>handler = os.popen(cmd,'r')>>>passwordString=handler.read() #passwordString为mkntpwd程序的输出结果
使用commands模块也可以获取程序的输出,它包含一些基于os.popen()的封装函数,使我们能更方便地获取运行系统命令和获取命令的输出,但该模块只在Unix系统下有效,不能用于Windows平台。>>> import commands>>> status,output = commands.getstatusoutput('ls -l')>>> print output总计 96564-rw-r--r-- 1 root root 4459 2005-12-01 10:23 2005.sxw-rw-r--r-- 1 root root 27511 2006-04-12 16:54 20060412_user.ods-rw-r--r-- 1 root root 202258 2006-01-06 16:48 2006风景-1月.jpg...>>> print status0
在Python2.4中引入一个新的模块叫subprocess,用于取代os.system、os.spawn*、os.popen*、popen2.*、commands.*。
编码转换#!/usr/bin/python#-*-coding:utf-8 -*-a=u"测试"b=a.encode('gb2312')print aprint b
交换两个变量>>> a,b = 1,2>>> a,b(1, 2)>>> a,b = b,a>>> a,b(2, 1)>>> a2>>> b1
测试数据类型>>> a=123>>> b='test'>>> a123>>> b'test'>>> isinstance(a,int)True>>> isinstance(a,str)False>>> isinstance(b,int)False>>> isinstance(b,str)True
用in判断是否包含子字符串>>> a='this is my test'>>> 'is' in aTrue>>> 'mm' in aFalse
__iter__迭代器>>> a = "iterator">>> t = iter(a)>>> t.next()'i'>>> t.next()'t'>>> t.next()'e'>>> t.next()'r'>>> t.next()'a'>>> t.next()'t'>>> t.next()'o'>>> t.next()'r'>>> t.next()Traceback (most recent call last): File "<stdin>", line 1, in ?StopIteration
自已写一个迭代器类>>> class reverse:... def __init__(self,data):... self.data=data... self.index=len(data)... def __iter__(self):... return self... def next(self):... if self.index == 0:... raise StopIteration... self.index = self.index - 1... return self.data[self.index]...>>> for char in reverse('iterator'):... print char...rotareti>>>
通过getattr可以得到一个在运行时才知道具体函数名的对象的引用,能增强我们程序的灵活性。>>> li=['a','b']>>> getattr(li,'append')>>> getattr(li,'append')('c') #相当于li.append('c')>>> li['a', 'b', 'c']>>> handler=getattr(li,'append',None)>>> handler<built-in method append of list object at 0xb7d4a52c>>>> handler('cc') #相当于li.append('cc')>>> li['a','b','c','cc']>>>result = handler('bb')>>>li['a','b','c','cc','bb']>>>print resultNone
编程示例:import statsoutdef output(data, format="text"): output_function = getattr(statsout, "output_%s" % format) return output_function(data)
以上代码表示,output函数接收一个data参数和format参数,根据format参数的值,从statsout模块中取出
output_text函数运行,data参数通过output_function(data)传递给了statsout模块中的output_text
函数。format取不同值可从statsout模块中取出不同的函数运行(output_xxxx)。也就是说我们要运行的函数是在程序运行后才确定
的。这样我们可把不同的函数以output_xxx形式命名放在statout模块中,通过以上程序可动态调用各种函数。
hasattr用于确定一个对象是否具有某个属性。语法: hasattr(object, name) -> bool判断object中是否有name属性,返回一个布尔值。
拆分序列>>> a=[c for c in 'abcdefg']>>> a['a', 'b', 'c', 'd', 'e', 'f', 'g']>>>
按if条件拆分序列>>> a=[c for c in '123456' if int(c)<3] 如果if的条件为真,则执行for循环>>> a['1', '2']>>> a=[c for c in '123456' if int(c)>3] 如果if的条件为假,则不执行for循环>>> a['4', '5', '6']
__dict__记录模块或类中所有对象的信息,它以字典{name:object}的形式记录这些信息,如果wikiaction是一个模块,则可以这样显示:>>>import wikiaction>>>print wikiaction.__dict__{'do_test': <function do_test at 0xb7c10534>, 'do_diff': <function do_diff at 0xb7c0ef0c>, 'do_refresh': <function do_refresh at 0xb7c1025c>, 'do_userform': <function do_userform at 0xb7c103e4>, 'getHandler': <function getHandler at 0xb7c105a4>, 'do_raw': <function do_raw at 0xb7c10454>, 'do_chart': <function do_chart at 0xb7c104c4>, 're': <module 're' from '/usr/lib/python2.3/re.pyc'>, 'pysupport': <module 'MoinMoin.util.pysupport' from '/usr/lib/python2.3/site-packages/MoinMoin/util/pysupport.pyc'>, 'config': <module 'MoinMoin.config' from '/usr/lib/python2.3/site-packages/MoinMoin/config.pyc'>}
'and'的特殊用法>>> 'a' and 'b' #如果两个都为真值,返回最后一个真值'b'>>> 'b' and 'a' #同上'a'>>> 'a' and 'b' and 'c' #同上'c'>>> '' and 'a' #如果有假值,则返回假值''>>> 'a' and '' and 'c' #同上''>>> '' and 0 #如果两个都为假值,返回第一个假值''>>> 0 and '' #同上0
'or'的的特殊用法>>> 'a' or 'b' #如果有一个为真值,则返回第一个真值'a'>>> 'b' or 'a' #同上'b'>>> 'a' or 'b' or '' #同上'a'>>> 0 and '' and {} #如果所有都是假值,则返回第一个假值0>>> {} and '' and {} #同上{}
lambda匿名函数的用法>>> a=lambda c:c*2>>> a<function <lambda> at 0xb7dd710c>>>> a(2)4>>> a(5)10
|