Archives for the ‘Programming/编程’ Category

用lxml来解析大型xml文件+命令行中的python

上周被布置了一个任务,要解析一个大约有600MB左右的xml文件,从中提取所需的信息然后输出成一个csv文件。从来没有做过类似东西的我,加上不太熟悉的python、linux和vim,这样一个简单的东西花了一天半才解决,不过解决的还算比较完美吧,用lxml这个库,原本以为要至少10几分钟的解析过程其实只用了1分钟左右,说起来,还是c比较强大啊,lxml的底层使用c实现的,换成python恐怕就够呛了。好了废话不多说,讲讲lxml的用法和我在做这个任务里碰到的几个问题吧,权当复习和备份。 用lxml载入xml文件 lxml是c中的libxml的python实现,在保证效率的情况下,为程序员免去了内存管理方面的麻烦,具体介绍大家还是移步它的官网吧。 首先在python里import lxml的etree模块,然后用etree里的parse函数从文件中解析xml,解析得到的是一个ElementTree的实例,用这个实例的getroot函数就能得到xml中的root。root是对象Element的一个实例,对这个root可以做indexing,即用过root[n]可以得到root下相应的子节点,这些子节点同样也是Element的实例,所以通过root[n][m]就可遍历各个节点。 >>>from lxml import etree >>>tree = etree.parse(open(“file_name”,“rb”)) >>>root = tree.getroot() 另外,对一个Element还可以进行iterate操作,iterate会依次遍历Element下的所有子节点、子节点的子节点,然后按照顺序,返回一个所有节点的序列。 如果我们有这样一个xml:

用互联网帮助你学习编程

用互联网除了可以帮助你谈恋爱,还能帮助你学习各种知识,在Academic Earth这个网站上聚合了众多美国知名大学的Open Course,Open Course就是把真实的美国大学课堂的录像放在互联网上给全世界的人免费观看,让无缘或者暂时还不能进入这些大学的人感受这些高等学府的课堂氛围。课程的范围很广,从Astronomy到Medicine都有。其实我去年就开始看斯坦福的一些开放课程,直到今年发现这个聚合网站,在加上iTunes在国外的速度较快、丰富的电子书和Google Calendar的短信提醒功能,我终于能有计划有进度的自学编程知识。 (Via)

关于咖啡豆的数学问题

在Guo Jing的Blog上看到这样一个数学问题 给定一个盛有一些黑色豆子和一些白色豆子的咖啡罐以及一大堆额外的黑色豆子,重复以下过程,直至罐中仅剩一颗豆子为止。 从罐中随机选取两颗豆子,如果颜色相同,就将它们都扔掉并且放入一个额外的黑色豆子,如果颜色不同,就将白色的豆子放回罐中,而将黑色的豆子扔掉。 证明该过程会终止。最后留在罐中的豆子颜色与最初的罐中的白色豆子和黑色豆子的数量有什么数学关系。 (via) 用循环的算法写出代码后,他写到 也就是说,无论我们怎么拿豆子,白色的豆子的取出的过程都是,2个,0个,2个,0个。 也就是说,白色的豆子为偶数个的时候,留下的一定是黑色,而白色豆子为奇数的时候,留下的一定是白色! 道理是对的,但是证明过程似乎有点简略了。