python项目实践Word下载.docx
《python项目实践Word下载.docx》由会员分享,可在线阅读,更多相关《python项目实践Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
html>
head>
title>
、、、<
/title>
/head>
body>
defend_document(self):
/body>
/html>
defstart_paragraph(self):
p>
defend_paragraph(self):
/p>
defstart_heading(self):
h2>
defend_heading(self):
/h2>
defstart_list(self):
ul>
defend_list(self):
/ul>
defstart_listitem(self):
li>
defend_listitem(self):
/li>
defstart_title(self):
h1>
defend_title(self):
/h1>
defsub_emphasis(self,match):
return'
em>
%s<
/em>
%match、group
(1)
defsub_url(self,match):
ahref="
%s"
>
/a>
%(match、group
(1),match、group
(1))
defsub_mail(self,match):
mailto:
deffeed(self,data):
printdata
这个程序堪称就是整个“项目”的基石所在:
提供了标签的输出,以及字符串的替换。
理解起来也比较简单。
再来瞧第二个模块“过滤器”,这个模块更为简单,其实就就是一个正则表达式的字符串。
相关代码如下:
self、addFilter(r'
\*(、+?
)\*'
'
emphasis'
)
(http:
//[\、a-z0-9A-Z/]+)'
url'
([\、a-zA-Z]+@[\、a-zA-Z]+[a-zA-Z]+)'
'
mail'
这就就是三个过滤器了,分别就是:
强调牌过滤器(用×
号标出的),url牌过滤器,email牌过滤器。
熟悉正则表达式的同学理解起来就是没有压力的。
再来瞧第三个模块“规则”,这个模块,抛开那祖父类不说,其她类应该有的两个方法就是condition与action,前者就是用来判断读进来的字符串就是不就是符合自家规则,后者就是用来执行操作的,所谓的执行操作就就是指调用“处理程序模块”,输出前标签、内容、后标签。
来瞧下这个模块的代码,其实这个里面几个类的关系,画到类图里面瞧会比较清晰。
rules、py:
classRule:
defaction(self,block,handler):
handler、start(self、type)
handler、feed(block)
handler、end(self、type)
returnTrue
classHeadingRule(Rule):
type='
heading'
defcondition(self,block):
returnnot'
\n'
inblockandlen(block)<
=70andnotblock[-1]=='
:
classTitleRule(HeadingRule):
title'
first=True
defcondition(self,block):
ifnotself、first:
returnFalse
self、first=False
returnHeadingRule、condition(self,block)
classListItemRule(Rule):
listitem'
returnblock[0]=='
-'
defaction(self,block,handler):
handler、feed(block[1:
]、strip())
classListRule(ListItemRule):
list'
inside=False
defaction(self,block,handler):
ifnotself、insideandListItemRule、condition(self,block):
self、inside=True
elifself、insideandnotListItemRule、condition(self,block):
self、inside=False
classParagraphRule(Rule):
paragraph'
补充utils、py:
defline(file):
forlineinline
yield'
defblocks(file):
block=[]
forlineinlines(file):
ifline、strip():
block、append(line)
elifblock:
、join(block)、strip()
最后隆重的来瞧下“语法分析器模块”,这个模块的作用其实就就是协调读入的文本与其她模块的关系。
在往重点说就就是,提供了两个存放“规则”与“过滤器”的列表,这么做的好处就就是使得整个程序的灵活性得到了极大的提高,使得规则与过滤器变成的热插拔的方式,当然这个也归功于前面在写规则与过滤器时每一种类型的规则(过滤器)都单独的写成了一个类,而不就是用if、、else来区分。
瞧代码:
importsys,re
fromhandlersimport*
fromutilimport*
fromrulesimport*
classParser:
def__init__(self,handler):
self、handler=handler
self、rules=[]
self、filters=[]
defaddRule(self,rule):
self、rules、append(rule)
defaddFilter(self,pattern,name):
deffilter(block,handler):
returnre、sub(pattern,handler、sub(name),block)
self、filters、append(filter)
defparse(self,file):
self、handler、start('
document'
forblockinblocks(file):
forfilterinself、filters:
block=filter(block,self、handler)
forruleinself、rules:
ifrule、condition(block):
last=rule、action(block,self、handler)
iflast:
break
self、handler、end('
classBasicTextParser(Parser):
Parser、__init__(self,handler)
self、addRule(ListRule())
self、addRule(ListItemRule())
self、addRule(TitleRule())
self、addRule(HeadingRule())
self、addRule(ParagraphRule())
self、addFilter(r'
handler=HTMLRenderer()
parser=BasicTextParser(handler)
parser、parse(sys、stdin)
这个模块里面的处理思路就是,遍历客户端(也就就是程序执行的入口)给插进去的所有的规则与过滤器,来处理读进来的文本。
有一个细节的地方也要说一下,其实就是与前面写的呼应一下,就就是在遍历规则的时候通过调用condition这个东西来判断就是否符合当前规则。
我觉得这个程序很像就是命令行模式,有空可以复习一下该模式,以保持记忆网节点的牢固性。
最后说一下我以为的这个程序的用途,1、用来做代码高亮分析,如果改写成js版的话,可以做一个在线代码编辑器。
2、可以用来学习,供我写博文用。
还有其她的思路,可以留下您的真知灼见。
补充一个类图,很简陋,但就是应该能说明之间的关系。
另外我还就是建议如果瞧代码捋不清关系最好自己画图,自己画图才能熟悉整个结构。
python项目练习二:
画幅好画
作者:
the5fire|标签:
pythonpdf
python实战
|发布:
2011-12-183:
35p、m、
这就是《python基础教程》中的第二个项目,关于python操作PDF
涉及到的知识点
∙1、urllib的使用
∙2、reportlab库的使用
这个例子着实很简单,不过我发现在python里面可以直接在数组[]里面写for循环,真就是越用越方便。
下面就是代码:
fromurllibimporturlopen
fromreportlab、graphics、shapesimport*
fromreportlab、graphics、charts、lineplotsimportLinePlot
fromreportlab、graphics、charts、textlabelsimportLabel
fromreportlab、graphicsimportrenderPDF
URL='
COMMENT_CHARS='
#:
drawing=Drawing(400,200)
data=[]
forlineinurlopen(URL)、readlines():
ifnotline、isspace()andnotline[0]inCOMMENT_CHARS:
data、append([float(n)forninline、split()])
pred=[row[2]forrowindata]
high=[row[3]forrowindata]
low=[row[4]forrowindata]
times=[row[0]+row[1]/12、0forrowindata]
lp=LinePlot()
lp、x=50
lp、y=50
lp、height=125
lp、width=300
lp、data=[zip(times,pred),zip(times,high),zip(times,low)]
lp、lines[0]、strokeColor=colors、blue
lp、lines[1]、strokeColor=colors、red
lp、lines[2]、strokeColor=colors、green
drawing、add(lp)
drawing、add(String(250,150,'
Sunspots'
fontSize=14,fillColor=colors、red))
renderPDF、drawTo,'
report3、pdf'
python项目练习三:
万能的XML
2011-12-203:
18p、m、
这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还就是太过于简单了,如果要就是可以连带生成css那就比较强大了。
这个有待后续研发,先来研究下怎么html网站结构。
既然就是通过XML结构生成网站,那所有的事情都应该由这个XML文件来。
先来瞧下这个XML文件,website、xml:
website>
<
pagename="
index"
title="
Homepage"
WelcometomyHomepage<
Hi,there、MynameisMr、gumby,andthisismyhomepage,herearesomeofmyint:
interests/shouting、html"
Shouting<
interests/sleeping、html"
Sleeping<
interests/eating、html"
Eating<
/page>
directoryname="
interests"
shouting"
Shouting"
shoutingpage<
、、、、<
sleeping"
Sleeping"
sleepingpage<
eating"
Eating"
Eatingpage<
/directory>
/website>
有了这个文件,下面应该来瞧怎么通过这个文件生成网站。
首先我们要解析这个xml文件,python解析xml与在java中一样,有两种方式,SAX与DOM,两种处理方式不同点在于速度与范围,前者讲究的就是效率,每次只处理文档的一小部分,快速而能有效的利用内存,后者就是相反的处理方式,先把所有的文档载入到内存,然后再进行处理,速度比较慢,也比较消耗内存,唯一的好处就就是可以操作整个文档。
在python中使用sax方式处理xml要先引入xml、sax中的parse函数,还有xml、sax、handler中的ContentHandler,后面的这个类就是要与parse函数来配合使用的。
使用方式如下:
parse('
xxx、xml'
xxxHandler),这里面的xxxHandler要继承上面的ContentHandler,不过只要继承就行,不需要有所作为。
然后这个parse函数在处理xml文件的时候,会调用xxxHandler中的startElement函数与endElement函数来一个xml中的标签的开始与结束,中间的过程使用一个名为characters的函数来处理标签内部的所有字符串。
有了上面的这些认识,我们已经知道如何处理xml文件了,然后再来瞧那个罪恶的源头website、xml文件,分析其结构,只有两个节点:
page与directory,很明显page表示一个页面,directory表示一个目录。
所以处理这个xml文件的思路就变的清晰了。
读取xml文件的每一个节点,然后判断就是page还就是directory如果就是page则创建html页面,然后把节点中的内容写到文件里。
如果遇到directory就创建一个文件夹,然后再处理其内部的page节点(如果存在的话)。
下面来瞧这部分代码,书中的实现比较复杂,比较灵活。
先来瞧,然后在分析。
fromxml、sax、handlerimportContentHandler
fromxml、saximportparse
importos
classDispatcher:
defdispatch(self,prefix,name,attrs=None):
mname=prefix+name、capitalize()
dname='
default'
+prefix、capitalize()
method=getattr(self,mname,None)
args=()
else:
method=getattr(self,dname,None)
args=name,
ifprefix=='
start'
args+=attrs,
method(*args)
defstartElement(self,name,attrs):
self、dispatch('
name,attrs)
defendElement(self,name):
end'
classWebsiteConstructor(Dispatcher,ContentHandler):
passthrough=False
def__init__(self,directory):
self、directory=[directory]
self、ensureDirectory()
defensureDirectory(self):
path=os、path、join(*self、directory)
printpath
print'
----'
ifnotos、path、isdir(path):
os、makedirs(path)
defcharacters(self,chars):
ifself、passthrough:
self、out、write(chars)
defdefaultStart(self,name,attrs):
self、out、write('
+name)
forkey,valinattrs、items():
%s="
%(key,val))
defdefaultEnd(self,name):
/%s>
%name)
defstartDirectory(self,attrs):
self、directory、append(attrs['
name'
])
defendDirectory(self):
endDirectory'
self、directory、pop()
defstartPage(self,attrs):
startPage'
=os、path、join(*self、directory+[attrs['
]+'
、html'
self、out=open(,'
w'
self、writeHeader(attrs['
self、passthrough=True
defendPage(self):
endPage'
self、passthrough=False
self、writeFooter()
self、out、close()
defwriteHeader(self,title):
\n<
\