怎么说呢,python可以算是救了我一命的一门语言,若不是他,恐怕公司的这个项目还遥遥无期,我会始终保有对他最崇高的敬意。 这里,我仅列出自己最近使用的几个库,并简单演示一下其高超的使用效率。 1.jinja2 简介:一个模板替换类,衍生于django的Template,在很多地方做了加强。 中文支持:模板文件的内容以及render传入的数据,如果含有多字节编码,则必须要先进行decode,渲染之后的结果也是经过decode的。 备注:jinja2在renderXML等格式的文件的时候,不会自动替换html标签,这点有时候是好事~~,因为我并不用jinjia直接来往前台吐页面。 使用: 使用方法很简单:
from jinja2 import Template
template = Template('Hello {{ name }}!')
print template.render(name='World')
也支持不定函数变量的传递:
from jinja2 import Template
template = Template('''
{{ name }}!
{%if test0 > 8%}{{test1}} is larger ! {%endif%}
{%if test1 > 8%}{{test1}} is larger ! {%endif%}
{%if test2 > 8%}{{test2}} is larger ! {%endif%}
''')
alls = [8,9,10]
mapAll = {}
for i, ch in enumerate(alls):
mapAll["test"+str(i)] = ch
print template.render(name='Hello!',**mapAll)
输出为:
Hello!!
9 is larger !
10 is larger !
2.simplejson/自带json 简介:一个把python数据结构和json互相转化的类 中文支持: 支持,但是当需要dumps的数据中含有unicode字符的时候,需要指定ensure_ascii = False,如下:
outdata = simplejson.dumps(pydata,ensure_ascii = False)
在dumps的时候,无论obj是否进行了decode都可以,但是当loads之后,则字符串一定被自动decode了 备注:无 使用:
import json
def main(x):
str_data = json.dumps(x,ensure_ascii=False)
print repr(str_data)
y = json.loads(str_data)
print repr(y)
if __name__ == '__main__':
x = {
'ret' : 1,
'msg' : '试试'
}
main(x)
x['msg'] = u'试试'
main(x)
输出结果如下:
'{"msg": "\xe8\xaf\x95\xe8\xaf\x95", "ret": 1}'
{u'msg': u'\u8bd5\u8bd5', u'ret': 1}
u'{"msg": "\u8bd5\u8bd5", "ret": 1}'
{u'msg': u'\u8bd5\u8bd5', u'ret': 1}
3.BeautifulSoup 简介:一个非常与众不同的解析HTML/XML的类库,用起来非常快捷,方便 中文支持:很好,在soup里面拿到的中文都是经过decode过的 备注:本博的糗事百科的vim插件就是用它来解析的html 使用: 假设待解析的数据如下(存在data中):
<?xml version='1.0' encoding='gb2312' ?>
<root>
<domain name='appbasesh.qzone.qq.com' operation='update'>
<ip inner='10.149.24.156' outer='180.153.2.222' isp='ctc' type='inner_ip'/>
<ip inner='10.150.16.29' outer='112.64.199.30' isp='cnc' type='com_proxy'/>
<ip inner='10.149.24.157' outer='180.153.2.223' isp='ctc' type='inner_ip'/>
<ip inner='10.149.24.158' outer='180.153.2.240' isp='ctc' type='inner_ip'/>
<ip inner='10.149.24.159' outer='180.153.2.241' isp='ctc' type='inner_ip'/>
<ip inner='10.149.24.160' outer='180.153.2.242' isp='ctc' type='inner_ip'/>
</domain>
</root>
代码如下:
soup = BeautifulSoup(data,convertEntities=BeautifulStoneSoup.HTML_ENTITIES)
iplist = []
#获取所有包含属性type="inner_ip"的节点
allTags = soup.findAll(attrs={'type' : 'inner_ip'})
for tag in allTags:
#获取属性列表
for at in tag.attrs:
#输出第一个属性的内容
print at[0]
4.minidom 简介:生成XML的工具 中文支持:支持,但是需要如下注意:
print doc.toprettyxml(encoding='UTF-8')
- 1.minidom的设置属性的方法是setAttribute,提供两个参数,一个属性名,一个属性值。之前在文章中介绍过,即当两个字符串相连时,encode/decode必须一致。
- 2.当minidom输出时,如果想指定xml头的encode为utf-8,可以如下写:
- 但是这里的要求就是,如果指定了encoding,那么传入minidom的字符串都应该decode成对应encoding的。而且这样toprettyxml输出的结果是encode过的。
备注:无 使用:
doc = minidom.Document()
item_info = doc.createElement("item_info")
item_info.setAttribute('maxid','90012')
doc.appendChild(item_info)
for o in mman_objs:
item = doc.createElement("item")
item_info.appendChild(item)
for k in o.keys():
attrdata = unicode(obj[k])
item.setAttribute(unicode(k),attrdata)
objdatas = doc.toprettyxml(encoding='UTF-8',indent = " ").decode('utf-8')
OK,这几个工具可以说涵盖了web开发中常用的几种交互方式,HTML/XML,json,模板替换,使用起来如鱼得水啊~
最近又发现了一个生成XML的更好的库,pyfo. 提供了python数据结构到XML的直接转化,并且对中文支持非常好。其测试代码tutorial.py中有详细使用说明。 需要注意的就是,测试代码没有说明属性的生成,其实每一行XML在pyfo中对应的是一个tuple(或list):
(name,data,attr)
其中name须为str,data基本可以为所有类型,attr必须为dict。 所以只要如下写:
('attr', 1,{'1':1,'2':2})
即可生成XML代码:
<attr 1="1" 2="2">1</attr>
Dante on #
最近又发现了一个生成XML的更好的库,pyfo.
http://pypi.python.org/pypi/pyfo/0.6
提供了python数据结构到XML的直接转化,并且对中文支持非常好。其测试代码tutorial.py中有详细使用说明。
需要注意的就是,测试代码没有说明属性的生成,其实每一行XML在pyfo中对应的是一个tuple(或list):
(name,data,attr)
其中name须为str,data基本可以为所有类型,attr必须为dict。
所以只要如下写:
('attr', 1,{'1':1,'2':2})
即可生成XML代码:
<attr 1="1" 2="2">1</attr>
Reply
依云 on #
貌似和那个json模块一样方便啊。有空再试,希望能顺利支持Python3,祈祷ing....
Reply
Dante on #
哈,用起来确实感觉不错,不过没试过是不是支持Python3……
Reply
nsdy on #
。。 一直在使用C++
说实话 一直想要学习gtk和python 总是感觉无从下手阿...
Reply
wlb5396340 on #
http://www.tuxradar.com/python
这个网站关于python和gtk的文章很好,还有视频演示
Reply
nsdy on #
谢了 兄弟
Reply
Insion on #
如果要在一个模板中引包含另一个子模板的时候,这个子模板中有中文就会提示UnicodeDecodeError
UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 572: invalid continuation byte,请问下这样要怎么处理才可以包含有中文的模板而不会出错呢?
Reply
Dante on #
模板是utf8的格式吗?用的是jinja2?
Reply
lxneng on #
我的文件是utf8的格式,但是也出现了UnicodeDecodeError错误
设置了
reload(sys)
sys.setdefaultencoding('utf-8')
就出下面的错误
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 53: unexpected code byte
去掉就出现
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 53: ordinal not in range(128)
Reply
Dante on #
传入的中文参数必须是解码过的,比如 u'中国',这样。
Reply
lxneng on #
解决了 是要给sqlalchemy的连接指定为charset =utf8
谢谢
Reply
lxneng on #
我也遇到这样的问题, 请问你是怎么解决的?
Reply
Insion on #
是jinja2,我现在用的flask会自动把jinja2也安装上去作为它的模板来用的。
上面说那个问题我已经解决了,是因为文件实际的编码不是utf8,另存一下就没事了。
但是用jinja2的话,在肯定模板是utf8编码的前提下通过用语句去包含我的子模板(其实就是我的网站的通用的头部),输出的时候头部会多出一两个换行(浏览器的HTML代码里貌似看不到BR换行符、应该是硬回车),导致css的排版会向下移动一两行的距离,后来我试下用web.py去写了一个模板去测试,发觉web.py的模板可以很好的显示出原来设计的页面。后来我就在flask下用mako去做模板,也没有问题,就是不明白,为什么套在jinja2里后会出现页面向下位移一两行的问题(可以render出页面),后来才发现只要一用include去包含其他模板就会这样,不知道你试过这样的问题没有?求解中~
Reply
Dante on #
嗯,好像确实有时候会多出来几行,不过因为对展示没有影响,所以一般都没管。。。。
Reply
Insion on #
UI的设计差之毫厘谬之千里,原来jinja2这个问题不是我一个人遇到,jinja2没解决这个问题前都不会考虑用它了,现在使用的是mako。
Reply