生活点点

  • Python-模块加载 包加载

    这是一篇关于Python加载目录中的模块的一个简单方法,可以用于模块开发。
    关于package
    通常包总是一个目录,可以使用import导入包:
    [python]
    import re #加载正则表达式
    [/python]
    或者from + import来导入包中的部分模块:
    [python]
    from time import datetime #从时间包中加载日期模块
    [/python]

    如何创建一个包呢?

    主要的一个文件是,包目录下为首的一个文件便是 __init__.py,内容可以为空。
    也就是说模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。

  • Python保留分隔符的Split

    Python牛逼小技巧,Python保留分隔符的Split方法。其实在Python手册里面写了很清楚,因为原来用不着,所以没注意,但是这次因为处理文本的时候,需要保留标点符号,因此特地的去查了一下。

    [python]
    >>>re.split(‘(W)’, ‘foo/bar spamneggs’)
    [‘foo’, ‘/’, ‘bar’, ‘ ‘, ‘spam’, ‘n’, ‘eggs’]
    [/python]

  • PYQT4的数据类型

    在使用PYQT写程序的时候,会遇到某些PYTHON中的函数不能用了,比如说针对QString就没有strip(),join的使用方式变成了list.join(“,”)逗号是分割符。究其原因是因为在使用PYQT读取数据后,数据类型已经不是在PYTHON上的数据类型了,随便找一个看看,比如
    [python]
    #文本编辑块
    self.textEdit_articlelist.toPlainText()
    #输出文本编辑内容类型
    print type(self.textEdit_articlelist.toPlainText())
    #得出其类别
    <class ‘PyQt4.QtCore.QString’>
    [/python]

    会发现她们的数据类型会是:

    那么要如何解决呢,很简单比如这个字符串类型的数据,通过str()转回到Python的数据类型就是了,就是这么简单的。

    附上Pyqt4的使用指南:http://pyqt.sourceforge.net/Docs/PyQt4/

  • [大数据处理]Python直接操作压缩包里面的文件

    大数据处理中,常常会遇到压缩后的数据包,比如BZ2,ZIP等格式,这里简单的介绍了Python在无解压的情况下读取BZ2压缩文件,另外通过lxml中iterparse()的对于XML大型文件处理的方法。

    在处理维基百科的DUMP包的时候,会遇到一个问题:大数据,几乎每一个DUMP在解压后都有400-500GB,没有解压之前如果是BZ2格式的话,大小也在20-30GB之间。
    对于大数据的一般处理顺序:解压压缩包,再处理。可是把所有压缩包解压,可能没有足够的硬盘空间, 而且也很费时间。那么就试试不解压的情况下来操作,整个过程都在Python 2.7.*的环境下运行。

    BZ2文件:

    [python]
    #加载bz2模块
    from bz2 import BZ2File as b2f

    fp = b2f("filename.bz2") #filename.bz2是要处理的压缩包名字
    line = fp.readline() #读取一行
    while line: #按行读取,并自动读完的时候停止
    print line
    line = fp.readline()
    [/python]

    现在我们知道了如何在不解压的情况下处理bz2格式的文件,那么维基百科提供的DUMP都按照BZ2格式的压缩,而且里面的文件是XML文件,那么该如何处理维基百科的数据呢?
    Python提供了xml.sax来处理XML大型文件,而且这个处理方式完全可以和上面的方式联合来直接操作20几个GB的数据包。这里就介绍一下操作方式,下面这段SAX代码引子别处,并且在上面做了一些修改, 源代码网址:http://my.oschina.net/renhc/blog/59646

    [python]
    from bz2 import BZ2File as b2f #加载bz2模块
    from xml.sax import parse, handler, SAXException

    class MyXMLSAXHandler(handler.ContentHandler):
    """
    用户自定义事件处理器
    """
    #文档开始事件处理
    def startDocument(self):
    print ‘Document Start…’

    #文档结束事件处理
    def endDocument(self):
    print ‘Document End…’

    #元素开始事件处理
    #"name"是节点名称,"attrs"是节点属性
    def startElement(self, name, attrs):
    print ‘encounter element(%s)’ % (name)

    #元素结束事件处理
    def endElement(self, name):
    print ‘leave element(%s)’ % (name)
    #内容事件处理
    def characters(self, content):
    if content.isspace(): #去掉内容中的空格
    return
    print ‘characters:’ + content

    try:
    fp = b2f("filename.bz2","r") #filename.bz2是要处理的压缩包名字
    parse(fp, MyXMLSAXHandler())
    except SAXException, msg:
    print msg.getException()
    except:
    print sys.exc_info()[0],sys.exc_info()[1]
    [/python]
    这段代码其实不难理解,类MyXMLSAXHander继承了handler.ContentHandler, 在parse()分析XML文件是,从头到尾像流水一下的处理文件,类似与逐行读取,并在读取到相应的节点的时候,进行相关处理。
    也许通过xml.sax来控制数据还是比较复杂且花费时间,那么可以试试lxml中提供的iterparse(),这个方法基于SAX,操作大型数据就变的简单多了,类似的Python自身也提供了iterparse()模块, 有兴趣的可以移步:
    http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse, 小提示:xml.etree.ElementTree和xml.etree.cElementTree都可以用哦,后者基于C的模块,速度会更快一些。 废话不多说,直接进入lxml.etree.iterparse()的用法,后面清除内存的那块一定得加。
    [python]
    from bz2 import BZ2File as b2f
    from lxml import etree

    f1 = "filename.xml.bz2"
    fp = b2f(f1,"r")
    node_find = "page" #要寻找的节点的名字

    #fp上面的传送过来的一个Objet, 其实也可以是一个文件名。
    #end是某个节点的结尾
    tree = etree.iterparse(fp,events=("end",), tag=node_find)
    for event, elem in tree:
    #输出结果
    print etree.tostring(elem, encoding="utf-8", pretty_print=True,
    xml_declaration=True)

    #清除内存
    elem.clear()
    while elem.getprevious() is not None:
    del elem.getparent()[0]
    [/python]

    好了,就到这里,如问题请留言。

  • 德国印象

    如果说“细致”是形容女人,“严谨”是形容男人,那么我对德国的第一印象就是严谨。

    严谨是因为他们的逻辑性,在车站的自动售票机是可以根据不同的条件购票,在可以一步掠过所有的选项。在火车上,每个位置有一个小的电子牌,告知这个位置从哪里到哪里被预订了,以避免临时买票的人占了别人位置的尴尬。在酒店,吸尘器的噪音会在你出现时消失,并在你离去后出现。在多特蒙德工业大学的学校食堂,有专门的机器回收空瓶,机器会根据回收瓶子的不同,给出与现金等价的小票,可以兑钱也可以购买东西,不知道是不是这里的特色。IMG_0563 (1)

    逻辑还不能说明严谨,因为严谨还得包括他们的大口喝酒大口吃肉的习惯。我一直以为,咱们是最爱吃肉的民族,没想到日耳曼民族更胜一筹。到这里的第一顿早餐,因为琳琅满目的肉可供选择,以至于让我觉得到了件肉铺子,经过一番询问才知道,这是他们早餐的传统,从早餐直到晚上,不论男女都爱吃肉。

    IMG_0137

    有可能有人问,这样不是很贵吗,在中国现在的肉价都涨价涨成这样了,但是德国的肉还真的不贵,在餐馆吃上一顿烤肉,比如这个,只要13欧元,若是在法国,起码得20欧左右。

    IMG_0581

    另外,13欧元也就是三大杯德国黑啤的价格,众所周知德国啤酒特别好,黑啤就更不用说了。吃饭的时候,可以没红酒,但是不能没啤酒,只有三两杯下肚后,才能满足。
    这次的德国之旅简短,有点可惜,比如只经过德国最大的体育场(Signal Iduna Park),却没能进去观看多特蒙德球队的比赛。

    IMG_0114
    IMG_0120

    经过科隆,却不能停下脚步参观科隆大教堂且在莱茵河畔坐一坐,看看科隆大桥上的同心锁。

    IMG_0591-1

    这就简单的将这些MARK起来,待下次有机会的时候,再好好的游玩一番。

  • 密码保护:情人节的玫瑰

    此内容受密码保护。如需查阅,请在下列字段中输入您的密码。

  • Ubuntu安装lxml

    lxml作为python处理xml文本的模块,文档开发的十分完善,个人非常推荐,以下是在ubuntu下的安装方式:

    由于lxml需要libxml2-dev和libxslt-dev两个模块支持,所以需要先安装这两个模块,

    apt-get install libxml2-dev libxslt-dev
    
    之后安装lxml
    apt-get install python-lxml
  • 圣诞集市

    圣诞集市

    圣诞集市,每年圣诞前夕出现在城市的市中心,届时约上好友去喝上几杯热红酒,吃上一些Raclette或Aligot,选上几件心仪的礼物送自己和送朋友,绝对是圣诞最佳的活动之一。

    给圣诞老爷爷寄封信怎样?

    圣诞老公公的信箱

    可丽饼(Crepe)

    圣诞集市-可丽饼(Crepe)

    热红酒,1欧元

    圣诞集市-热红酒圣诞集市-热红酒

    炒板栗哦

    圣诞集市-板栗

    妈妈我要气球

    圣诞集市

    肉色美女

    圣诞集市

  • 一壶茶

    20131209-101115.jpg

    一壶茶后得清醒,据说在茶中添加一些枸杞子会对身体好,虽然不能确定,但是味道确实不错!

  • Python中def的内存处理

    python def定义了一个方法(函数/模块),他们的内存使用方式很简单,调用完就清楚内存,但是有特别的情况比如调用模块libxml2。

    python在通过def定义了一个方法后,每次调用这个模块,都将进行内存加载。但是一旦使用完整个方法并返回后,python的内存管理机制,将会自动将所有的内存清空。网上已经有很多文章讲解内存管理机制,因此这里就简单的引用一下别人的文章,做个记录。

    关于Python的内存管理机制,这里引用51cto的一篇文章中提到的:
    “在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。
    这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。这也就是之前提到的Pymalloc机制。
    在Python 2.5中,Python内部默认的小块内存与大块内存的分界点定在256个字节,这个分界点由前面我们看到的名为SMALL_REQUEST_THRESHOLD的符号控制。
    也就是说,当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。
    在一个对象的引用计数减为0时,与该对象对应的析构函数就会被调用。”

    引用地址:
    http://developer.51cto.com/art/201007/213585.htm