##language:zh #pragma section-numbers on ||'''status'''|| 草稿 || 清风|| 完成度80%|| <> = 用Python完成常见任务 = 为何要学习Python?到google可以搜索到一大堆理由。 我的理由是其字符串处理能力,和随心所欲的脚本语言写法,写Java总有一种很严肃很认真的感觉,而Python则很简便,有一种想法到哪,程序就到哪里的感觉 今天学习几个简单的部分: == 文件操作 == === 读文件 === {{{ #!python for line in open("/tmp/1.txt","r") : print line }}} === 写文件 === {{{ #!python f = open("/tmp/1.txt","w")#可读可写模式 f.write("123")#写入字符串 f.close()#关闭文件 }}} == Python的文本处理 == 任务:读取tomcat的日志文件,并且把日期开头的内容显示出来,例如:xxxx-xx-xx {{{ #!python import re regx = "\d\d\d\d-\d\d-\d+" for str in open("c:\stdout.log","r"): if re.search(regx,str): pintr str }}} 一个用来测试Python正则表达式的工具: http://kodos.sourceforge.net/ 图形界面,简单易用,适合学习Python的正则表达式 === 什么是正则表达式 === {{{ 样本规则表达式 ABC([d-w]*\d\d?)+XYZ 对于要匹配这个表达式的字符串,它必须以 "ABC" 开头、以 "XYZ" 结尾 -- 但它的中间必须要有什么呢?中间子表达式是 ([d-w]*\d\d?),而且后面跟了“一或多”运算符。所以,字符串的中间必须包括一个(或者两个,或者一千个)与括号中的子表达式匹配的字符或字符串。字符串 "ABCXYZ" 不匹配,因为它的中间没有必要的字符。 不过这个内部子表达式是什么呢?它以 d-w 范围内的零或多个字母开头。一定要注意:零字母是有效匹配,虽然使用英语单词 "some"(一些)来描述它,可能会感到很别扭。接着,字符串必须恰好有一个数字;然后有零或一个附加数字。(第一个数字字符类没有循环运算符,所以它只出现一次。第二个数字字符类有 "?" 运算符。)总而言之,这将翻译成“一个或两个数字”。以下是一些与规则表达式匹配的字符串: 匹配样本表达式的字符串 ABC1234567890XYZ ABCd12e1f37g3XYZ ABC1XYZ 还有一些表达式与规则表达式不匹配(想一想,它们为什么不匹配): 不匹配样本表达式的字符串 ABC123456789dXYZ ABCdefghijklmnopqrstuvwXYZ ABcd12e1f37g3XYZ ABC12345%67890XYZ ABCD12E1F37G3XYZ 需要一些练习才能习惯创建和理解规则表达式。但是,一旦掌握了规则表达式,您就具有了强大的表达能力。也就是说,转而使用规则表达式解决问题通常会很容易,而这类问题实际上可以使用更简单(而且更快速)的工具,如 string,来解决。 }}} == Python的网络操作 == === Python和XML-RPC === ==== 何为XML-RPC? ==== XML-RPC 是 XML Web 服务的鼻祖。它是一个用于远程过程调用(remote procedure call,RPC)的简单规范,这种调用使用 HTTP 作为传输协议,并使用 XML 词汇表作为消息有效负载。由于 XML-RPC 非常简单(整个规范打印出来还不到十页纸),它已经变得非常流行,现在大多数语言都有了标准的或已经可用的 XML-RPC 实现。这些语言中包括 Python,它在版本 2.2 中就开始捆绑 xmlrpclib(Fredrik Lundh 开发的 XML-RPC 实现)了。 ==== 任务:尝试Python的XML-RPC远程调用 ==== 首先,我们打算将CMS(Context Manager System)系统进行Python的改造,第一件事,先向外公开版本的变化,可供远程调用。 {{{ #!python import SimpleXMLRPCServer #定义自己的CMS类 class MyCMS: def getVersion(self):#向外公开版本的方法 return "Powerd By Python 0.1a" cms = MyCMS() server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8888)) server.register_instance(cms) print "Listening on port 8888" server.serve_forever()#服务器执行,并监听8888端口 }}} 客户端调用代码,获得最新的版本信息 {{{ #!python import xmlrpclib server = xmlrpclib.ServerProxy("http://localhost:8888";) version = server.getVersion() print "version:"+version }}} ==== 总结 ==== 比同等的JAVA实现代码量明显减少,使精力能够更多的集中到系统本身中来 JAVA的一个XmlRpc实现:http://ws.apache.org/xmlrpc/ JAVA调用代码如下: {{{ #!java XmlRpcClient xmlrpc = null; try { xmlrpc = new XmlRpcClient("http://localhost:8888/";); } catch (MalformedURLException e) { e.printStackTrace(); } Vector params = new Vector(); try { String result = (String) xmlrpc.execute("getVersion", params); System.out.println(result); } catch (XmlRpcException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } }}} ==== 参考资料 ==== 想了解更多,请到这里: http://www.python.org/doc/current/lib/module-xmlrpclib.html http://www.python.org/doc/current/lib/module-SimpleXMLRPCServer.html === 任务:抓取FarideaBBS首页的所有图片 === 主要应用技术:正则表达式&urllib 第一步,模拟HTTP连接,连接FarideaBBS,获取Html源代码 {{{ #!python import urllib def farideaHttp(): page = urllib.urlopen("../Boards.asp";) body = page.readlines() page.close() return body }}} 第二步分析Html源代码,建立正则表达式: 今天先建立一个简单的表达式,不考虑图片链接是否有http头 {{{ #!python regx = r""">>print abs(-100) 100 >>>print abs(1+2j) 2.2360679775 }}} === callable(object) === callable()函数用于测试对象是否可调用,如果可以则返回1(真);否则返回0(假)。可调用对象包括函数、方法、代码对象、类和已经定义了“调用”方法的类实例。 {{{ >>> a="123" >>> print callable(a) 0 >>> print callable(chr) 1 }}} === cmp(x,y) === cmp()函数比较x和y两个对象,并根据比较结果返回一个整数,如果xy,则返回1,如果x==y则返回0。 {{{ >>>a=1 >>>b=2 >>>c=2 >>> print cmp(a,b) -1 >>> print cmp(b,a) 1 >>> print cmp(b,c) 0 }}} === divmod(x,y) === divmod(x,y)函数完成除法运算,返回商和余数。 {{{ >>> divmod(10,3) (3, 1) >>> divmod(9,3) (3, 0) }}} === isinstance(object,class-or-type-or-tuple) -> bool === 测试对象类型 {{{ >>> a='isinstance test' >>> b=1234 >>> isinstance(a,str) True >>> isinstance(a,int) False >>> isinstance(b,str) False >>> isinstance(b,int) True }}} === len(object) -> integer === len()函数返回字符串和序列的长度。 {{{ >>> len("aa") 2 >>> len([1,2]) 2 }}} === pow(x,y[,z]) === pow()函数返回以x为底,y为指数的幂。如果给出z值,该函数就计算x的y次幂值被z取模的值。 {{{ >>> print pow(2,4) 16 >>> print pow(2,4,2) 0 >>> print pow(2.4,3) 13.824 }}} === range([lower,]stop[,step]) === range()函数可按参数生成连续的有序整数列表。 {{{ >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1,10,2) [1, 3, 5, 7, 9] }}} === round(x[,n]) === round()函数返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。 {{{ >>> round(3.333) 3.0 >>> round(3) 3.0 >>> round(5.9) 6.0 }}} === type(obj) === type()函数可返回对象的数据类型。 {{{ >>> type(a) >>> type(copy) >>> type(1) }}} === xrange([lower,]stop[,step]) === xrange()函数与range()类似,但xrnage()并不创建列表,而是返回一个xrange对象,它的行为与列表相似,但是只在需要时才计算列表值,当列表很大时,这个特性能为我们节省内存。 {{{ >>> a=xrange(10) >>> print a[0] 0 >>> print a[1] 1 >>> print a[2] 2 }}} == 小结 == ## 总体回顾,给出相关阅读和思考指引 == 练习 == ## 设计实用练习,保证每个练习都可以扩展出去 ---- ::-- [[qingfeng]] [<>] ''[[/PageCommentData|评注编辑入口]]''