👉 梓料领取方式:只需【点击这里】,即刻解锁您的Python学习新篇章!让我们携手并进,在编程的海洋里探索无限可能
实例1:文件批量处理
如对文件进行批量重命名,将文件夹中所有的文件名的”scroll_1”替换为”scroll_00”。
文件批量重命名 |
import os path = 'C:\\Users\\tylerzhu\\Desktop\\icon' for file in os.listdir(path): if os.path.isfile(os.path.join(path,file))==True: newname = file.replace("scroll_1", "scroll_00") os.rename(os.path.join(path,file),os.path.join(path,newname)) print(file) |
实例2:xml与excel互转
Excel转xml
Excel,info_fight_monster.xls包含3个sheet,分别表示怪物的基本信息、技能信息、奖励信息。
XML,info_fight_monster.xml包含怪物的所有信息,格式如下:
<monster attack="84" attrib="2" classId="20" define="37" desc="" frameRate="24" icon="cdn/imageres/pets/pet_56_20.png" level="4" luck="0" monsterSID="1024" name="被驯服的小火猴" skill="74" speed="0" strength="447" type="0" url="cdn/flashres/pets/pet_20.swf"> <skill skillLevel="2" skillSID="30048"/> <skill skillLevel="2" skillSID="30034"/> <prize desc="" gameID="0" infoType="27" itemSID="80001" itemType="0" level="小火猴的魔法棒" name="" num="1" plusSID="400001" prizeSID="1" type="1"/> </monster> |
编写脚本将Excel转换为XML格式。
Excel转XML |
#! /usr/bin/env python #coding=utf-8 ''' Created on 2013-3-31 将info_fight_monster.xls转换为XML格式。转换分为以下几步: step1: 读取xml文件,info_fight_monster.xls step2: 解析出怪物基本信息,在base这个sheet里面,并放到一个xml文件中 step3: 解析出怪物的技能信息,并将技能信息插入到对应的xml中 step4:解析出怪物的奖励信息,并插入到对应XML中 step5:保存xml文件 @author: tylerzhu''' from lxml import etree import xlrd3, codecs
attrib = ["monsterSID", "classId", "type", "level", "attrib", # "attack", "skill", "define", "speed", "strength", # "luck", "name", "desc", "icon", "url", "frameRate"];
prize = ["monsterSID", "prizeSID", "type", "infoType", "gameID", "itemType", # "itemSID", "num", "plusSID", "level", "name", "desc", "icon"];
skill = ["monsterSID", "skillSID", "skillLevel"];
info_fight_monster_xml = etree.ElementTree(etree.Element("data"));
def openxls(): excel = xlrd3.open_workbook("xls/info_fight_monster.xls"); base = excel.sheet_by_name("base"); monster = excel.sheet_by_name("skill"); prize = excel.sheet_by_name("prize"); return (base, monster, prize);
def buildMonsterBase(xls): sheet = xls[0]; for row in range(1, sheet.nrows): monsterAttr = {}; for col in range(0, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): monsterAttr[attrib[col]] = sheet.cell(row, col).value; if type(monsterAttr[attrib[col]]) == float: #print(str(round(monsterAttr[attrib[col]]))) monsterAttr[attrib[col]] = str(round(monsterAttr[attrib[col]])); sub = etree.SubElement(info_fight_monster_xml.getroot(), "monster", monsterAttr); sub.tail = "\n" #input()
def buildMonsterSkill(xls): sheet = xls[1]; for row in range(1, sheet.nrows): skillAttr = {}; for col in range(1, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): skillAttr[skill[col]] = sheet.cell(row, col).value; if type(skillAttr[skill[col]]) == float: skillAttr[skill[col]] = str(round(skillAttr[skill[col]])); monsterSID = str(int(sheet.cell(row, 0).value)); monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']"); monster.text = ("\n\t"); sub = etree.SubElement(monster, "skill", skillAttr); sub.tail = "\n\t"
def buildMonsterPrize(xls): sheet = xls[2]; for row in range(1, sheet.nrows): prizeAttr = {}; for col in range(1, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): prizeAttr[prize[col]] = sheet.cell(row, col).value; if type(prizeAttr[prize[col]]) == float: prizeAttr[prize[col]] = str(round(prizeAttr[prize[col]])); monsterSID = str(int(sheet.cell(row, 0).value)); monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']"); monster.text = ("\n\t"); sub = etree.SubElement(monster, "prize", prizeAttr); sub.tail = "\n\t"
def build(): xls = openxls(); buildMonsterBase(xls); buildMonsterSkill(xls); buildMonsterPrize(xls);
#输出合并之后的配置 ouput = codecs.open('output/info_fight_monster.xml', 'w', 'utf-8'); ouput.write(etree.tounicode(info_fight_monster_xml.getroot())) ouput.close();
if __name__ == '__main__': build(); |
是不是很简单!
Xml转Excel
下面的例子将技能书info_fight_book.xml的数据转换为excel格式,例子只包含一个sheet的,如果有多个sheet同样处理即可。
XML转Excel |
#! /usr/bin/env python #encoding=utf-8 ''' Created on 2013-5-6 将技能书info_fight_book。xml转换为excel格式。 例子只包含一个sheet,如果有多个sheet同样处理。 @author: tylerzhu ''' from lxml import etree import xlwt3 as xlwt #写excel标题 #。。。 wb = xlwt.Workbook() ws = wb.add_sheet("技能书")
tree = etree.parse('../xls/info_fight_book.xml') root = tree.getroot() row = 0 col = 0 for item in root: if len(item.attrib) == 0: continue row = row + 1 col = 0 for attr in item.attrib: ws.write(row, col, item.attrib[attr]) col = col + 1
wb.save('../output/技能书.xls') |
总结
通过上面例子,发现Python代码有以下特点:
l 第一行是特殊形式的注释:它被称作 组织行 ——源文件的头两个字符是#!,后面跟着一个程序。这行告诉你的Linux/Unix系统当你 执行 你的程序的时候,它应该运行哪个解释器。建议使用这种形式——#!/usr/bin/env python,而不是——#!/usr/bin/python。
l 缩进很重要。Python使用缩进而不是一对花括号来划分语句块。
l 文档字符串,__doc__,没多大用。但是一个好的Python程序,应该要有文档字符串,且一般遵循:“文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。”
l python中引入模块后(import)首先就要执行模块的主块,当然模块中可能全是函数。如果要避免使用模块名称:from 模块名 import 符号名,那麽使用该符号名就不用使用模块名+点号+符号名,但是不推荐,容易造成程序不容易读,而且容易出错(特别是在python简洁而简单的语法的基础上)import... as ...起一个别名
l 模块的__name__属性,相当有用,解决了import的缺点,可以实现如果不是运行的本模块而被调用,不调用主块
l 如果你已经厌烦了java、c++的读写文件,那么python会让你重新喜欢上文件读写,python主张解决问题的方案越少越好,写文件就一个f = file(name, 'w'),f.write(...)读文件也一样,f = file(name),f.read或readline,最后close
l ……
前途!钱途!
图:据说几年之前,有公司因为提高跳槽门槛而使用Python(摘自:知乎)
上面那截图只是2玩笑而已:-)。不管怎样,现在Python已经成为最受欢迎的程序设计语言之一,完全不用担心这个了。
TIOBE编程语言排行榜,2007、2011两年被TIOBE编程语言排行榜评为年度语言。
图:TIOBE编程语言(2002~2012 Python索引)
PYPL(Popularity of Language Index)编程语言流行指数,它对各种语言的流行指标进行了二次发掘。在过去的十年里,Python语言获得了最大的增长幅度——十年语言之冠。
图:编程语言流行指数(http://goo.gl/Nku0I)
开发效率极高
据说豆瓣开发只用了3个月时间就上线了。开发效率高,有以下几方面原因。
丰富的内置类型及相关操作
l String:字符串放在单引号、双引号、三引号(多行时)中,从0开始索引,支持
n 查:find、index、
n 切片: s[0:2]、s[1:]
n 连接:“abc”+“ef” => “abcdef”、join
n 分割:split
n 格式化: format
n 。。。大小写转换、编码等操作
l list, []:names=[“Dave”, “Mark”, “Ann”],列表从0开始索引,索引元素names[1]。列表可以包括任意类型的对象,可以嵌套。支持增、删、查、分片。
n 增:insert、append
n 删:del、remove、pop
n 查:search
n 切片: names[0:2]、[1:]
n 连接:[1,2,3]+[4,5] => [1,2,3,4,,5]、extend
n 反转:reverse
l tuple, ():address=(“www.python.org”, 80),a = (80,)。元组语法与list相似,意义相当于枚举,可以为空,如果只含有一个元素,需要加逗号以区别于表达式(“one”, )。元组创建之后不可修改,即无法替换、删除、插入,但支持
n 索引:address[0] => www.python.org
n 切片:address[0:] => ('www.python.org', 80)
n 连接:(“www.python.org”,) + (80,) => ('www.python.org', 80)
n host,port=address:host => www.python.org,port => 80
l 字典: dict(), {}:address={"host":"www.python.org", "port":80},支持
n 索引:address[“host”] => “www.python.org”,
n get:address.get("host") => “www.python.org”
n 键:address.keys() => ['host', 'port']
n in:"host" in address =>True
n 删除:del address["host"] => {'port': 80}
l 集合:set(),a=set([1,2,3,4]);一个数值集合 b=set(“hello”),一个唯一字符集合。与列表、元组不同,集合中的元素是无序的,无法通过数字索引,且元素不能重复。
n 并集:a|b => set([1, 2, 3, 4, 'h', 'l', 'o', 'e'])
n 交集:a&b => set([])
n 差集:a-b => set([1, 2, 3, 4]),即在a中不在b中元素
n 对称差集:a^b => set([1, 2, 3, 'e', 'h', 'l', 'o', 4])
n add:a.add(5) => set([1, 2, 3, 4, 5]) #添加一项
n update: a.update([6,7,8]) =>set([1, 2, 3, 4, 5, 6, 7, 8])#添加多项
n remove: a.remove(5) =>set([1, 2, 3, 4, 6, 7, 8])#删除一项
强大的标准库
Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。
Python标准库的主要功能有:
- 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
- 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
- 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
- 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
- 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
- W3C格式支持,包含HTML,SGML,XML的处理。
- 其它功能,包括国际化支持、数学运算、HASH、Tkinter等
无所不包的第三方库
如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面。
“There are currently 30630 packages here.”—— PyPI · The Python Package Index。
总而言之
用下图可以表示Python的强大。
图:Python(来自:xkcd,xkcd: Python)
看Python在我工作中的应用,好像没什么说服力,证明不了啥。下面让我们看看有哪些大公司或有名的应用在使用Python,使用了哪些技术。
4.1. 国外
图:谁用在用Python
上图只是列举了部分具有典型代表的公司,要列出所有的实在太困难的,因为太多国外在使用Python了。
Python Google的三大编程语言之一
在Google,C++、Java、Python是使用率排名前三的编程语言,使用Python的开发团队也是Google的第三大研发部门。
在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。
groups.google.com,code.google.com就是运行于Python之上的。此外,Python还广泛的用于基础维护部门。Guido Van Rossum加入Google的第一个项目Google Mondrian,是一个在线的代码预览系统,基于Perforce、BigTable(back-end)以及Python(front-end)。它使用了以下Python相关技术(http://goo.gl/3f5sy):
The application is built on top of Python open source libraries such as the Django framework, smtpd.py mail service, and the wsgiref web server software。
Google雄心勃勃的云计算平台Google App Engine最早支持的Python编程语言。
YouTube主要是Python写的
l Apache
l Python
l Linux(SuSe)
l MySQL
l psyco,一个动态的Python到C的编译器
l lighttpd代替Apache做视频查看
most of the lines of code for YouTube are still in Python. Everytime you watch a YouTube video you are executing a bunch of Python code.
YouTube解决问题的哲学只有一个词:简单。许多YouTube的产品最初只是源于一个简单的Python脚本。
在线视频王者YouTube的技术哲学,http://goo.gl/PHMUE,7 Years Of YouTube Scalability Lessons In 30 Minutes
Quora - Python 驱动
下面内容主要摘自并加入了自己的注释:Quora - Python 驱动,http://goo.gl/28RGq。
Quora 是使用什么语言和框架做的?
What languages and frameworks were used to code Quora?
创始人 Charlie 的回复:
- 后端使用 Python 语言,Pylons 框架,但是框架一半左右被自己的系统替换(LiveNode/webnode2)
- 前端 JavaScript 基于 jQuery
- 用Thrift做后端服务器之间通信(thrift最初由facebook开发,07年四月开放源码,thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。)
- Comet Server 使用Tornado
- hosting 主要使用 Amazon EC2, S3
- 目前数据库使用 MySQL,memcached 做缓存,还有两个用 C++ 写的服务一起作为 data store
- 版本控制用 Git
为什么 Quora 选择 Python 作为开发语言
Why did Quora choose Python for its development?. 下文只是简单整理,不是翻译。
创始人 Adam 的回复里,提到两个创始人正好都比较熟悉 Python. 另外他说明了排除其它语言的过程:
- PHP 根本不考虑。Facebook 陷进去无法脱身,不代表它是目前最好的选择,由此得到的经验是编程语言的选择非常重要而且改变的代价非常大。Adam 此处给了其它几个链接,其中有指出 PHP 一大堆弱点的,也包括一个问题 "Do Facebook engineers enjoy programming in PHP?". 我很赞同 Facebook 的工程师说的,familiarity breeds contempt. 没有完美的语言,每一种语言都有长有短,当把它用到极限的时候,短处就变得很显眼并让人烦恼。我个人认为 PHP 也仍然是不差的选择。
- C# - 看起来不错但是 -
- 他们不想把基础搭建在微软的技术平台上。SQL Server 很好,不过 Quora 需要一大堆开源软件,这些代码即使支持 .NET, 也支持得比较差。
- 不想冒险使用 Mono,因为不知道它能撑多久,而且据说有性能问题
- Java 程序因为一些原因很容易变得更长,写起来比 Python 痛苦多了。
- Scala 太新,也是一种冒险,另外虽然不像 Java 那么差,它也天生继承 JVM 的一些弱点。
Python 虽然有性能问题,但是 Quora 一些性能很关键的代码都用 C++ 写(Python 的优势,Java 做起来相对困难)。至于类型检查的缺乏,Quora 通过完善的单元测试来弥补。
Quora 另一位创始人 Charlie 加了几点:
- 创立 Quora 的时候,Python 有许多很好的 web framework
- Python 的数据结构跟 JavaScript 映射很好,这样 CS 之间交互数据很方便
- Python 代码更易读
- Python 在各方面有很多成熟的 library
为什么 Quora 要用 Pylons 做开发
Why did Quora choose to develop in Pylons?. Charlie 说他们想把 Pylons 的很多东西替换成自己的,比如他们不需要模版和 ORM. 在这方面,Pylons 比 Django 之类的要好。
Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado
其他八项可以查看:http://goo.gl/nzFCy
Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado,是用 Pyhton 语言开发的实时网络服务器,它支持上万的不间断连接,也支持以长轮询(long-polling)方式发布实时数据。
Tornado 最初是由 FriendFeed 公司开发出来的,而 FriendFeed 在 2009 被 Facebook 收购。随后 Facebook 发布 Tornado 开源工程,现在包括 Quora 在内的多家网站已使用 Tornado。
Reddit使用Python重写
Reddit(美国最大的网上社区)最早是用 Common Lisp 开发,随之用 Python 进行了重写(2005年底完成)。著名的Python 框架 Web.py 就是 Reddit 当时的员工 Aaron Swartz 开发的,现在 Reddit 的 Web 框架则使用了 Pylons 。在 2009 年 11 月,Reddit 迁移到 Amazon 的云计算平台。前端框架现在用的是 jQuery。或许你早就知道,Reddit 网站程序现在已经开源https://github.com/reddit/reddit,如果你感兴趣的话,不妨下载研究。
Dropbox
Dropbox 的99.9%的代码是用Python写的。Python使用在服务器端、桌面客户端、网站控制逻辑,后端的 API 和分析。
使用 Python 语言编写的代码,通过使用PyObjs,WxPython,types,py2exe, py2ap,PyWin32等工具,让Dropbox运行在Windows,Mac和Linux系统。
6 Lessons From Dropbox - One Million Files Saved Every 15 Minutes,http://goo.gl/Qj5sJ。
10亿美元被Facebook收购的Instagram,主要使用Python等开源技术。
应用服务器:
l 使用Django框架。
l 使用Gunicorn作为 WSGI 服务器(过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源)。
l 使用 Fabric 加速部署。
任务队列/发布通知
队列服务使用Gearman,工作实例(都用Python写的)在给定的时间内对队列中的任务进行消费,并分发给不同的服务;对于消息推送,找到的最划算的方案是,一个开源的Twisted 服务 pyapns(A universal Apple Push Notification Service (APNS) provider)来实现,已经为Instagram处理了超过10亿条通知,并且绝对可靠。
参考:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,http://goo.gl/mkfQN;中文版:http://goo.gl/Dkymt。
OpenStack
OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目。
OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。此外,OpenStack也用作建立防火墙内的“私有云”(Private Cloud),提供机构或企业内各部门共享资源。
- 以Python编程语言编写
- 整合Tornado网页服务器、Nebula运算平台
- 使用Twisted软件框架
- 遵循Open Virtualization Format、AMQP、SQLAlchemy等标准
- 虚拟机器软件支援包括:KVM、Xen、VirtualBox、VMware、Hyper-V
国内
腾讯
腾讯游戏运营支撑体系的开发团队,在使用django/celery/rabitmq/mongodb开发了一个已广泛使用的内部开放平台。
Django:是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。
Celery:(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。celery用于生产系统每天处理数以百万计的任务。celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。celery是易于集成Django, Pylons and Flask,使用 django-celery, celery-pylons and Flask-Celery 附加包即可。
豆瓣
豆瓣最初使用Python开发,只是用了3个月。洪强宁,《Python于web2.0网站的应用》,http://goo.gl/ZaI9s;《Python在豆瓣的应用》,http://goo.gl/IgeGe
最早的豆瓣就完全使用 Python 开发,后台索引基于 twisted,GUI 使用 Quixote,还用到了 cElementTree,数据库是 MySQL。所以豆瓣天生就有着 Python 的文化。在豆瓣,开发环境正逐步从 Subversion 向 mercurial 迁移,还使用了 Python 编写的 trac 和 IRC,之所以选择 IRC 是因为 IRC 有很大的灵活性,可以编写 Bot 自动化很多东西。除此之外:
l m.douban.com使用:Pylons
l 内部管理系统使用: Django
l DPark系统:使用Python编写,支持迭代计算的MapReduce框架
l DAE(douban app engine):使用Python编写,类似于GAE、SAE,定位为内部的 PaaS 平台。
新浪SAE
新浪Sina App Engine Python,是新浪研发的PaaS(平台即服务)平台,已经开始支持Python了。陈正《Introduction to SAE Python》, http://goo.gl/0lkRm
搜狐邮箱
2007年,搜狐邮件中心基于webpy(除了webpy,还用了优秀的WEB框架 – Tornado),发布了"搜狐闪电邮"的第一个Python版本。之后,Python就在搜狐邮件中心蓬勃的发展起来。到今天,搜狐邮箱已经成为国内最大的Python应用之一。而Python也成为了搜狐邮箱使用最广泛的语言。从运维到开发,从业务系统到基础服务,到处都存在它的影子。
知乎
(摘自知乎官方解答)知乎开发主要用的是friendfeed的框架tornado。Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因-----因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。
但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。
所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。
各种游戏公司
国内一些游戏后台使用Python开发,特别是一些网页游戏。可以搜索下有哪些公司在招聘Python游戏开发,会发现有很多公司在招聘。
下面是几篇在PyCon会议上的文章:
l 王健,《中型角色扮演游戏服务器的Python应用》,http://goo.gl/b2R6M
l 赖勇浩,《Python于 webgame 的应用》,http://goo.gl/1QMOT
l 林伟(skywind),《Python游戏开发探索与发现》中告诉大家Python已经足够简化到让策划人员也能写代码,用Python来描述一个游戏的场景。国内WebGame已经超过国外,在网易大量游戏项目用Python相关内容开发。
通过上面的介绍,是不是迫不及待的想学习下Python了。下面推荐学习Python相关工具与文章。
入门资料
l wiki:http://zh.wikipedia.org/zh/Python
l Chinaunix的Python论坛资料
l 《OReilly-Learning-Python-4th-Edition-Oct-2009》
l 《简明 Python 教程》(中文),对应的英文版是《A Byte of Python》
l 深入 Python 3,http://goo.gl/cyrUY
工具
l UliPad 代码编辑工具(本身由python编写)
l Pydev:eclipse + pydev插件