存档

文章标签 ‘Python’

PyExcelerator:用Python处理Excel文件

2009年4月16日

我们写程序,经常会需要输出一些数据进行保存,对于格式固定的大量数据,Excel表格会是比较好的一个选择。如果你需要在Python下写入Excel文件,那么就需要用到PyExcelerator了。

PyExcelerator是一个第三方库,用来处理Excel文件。它的优点是:

简单易用,上手快。

写操作很方便,适合用来生成Excel文件记录数据。

不需要WinCOM支持,没装Office也 可以生成Excel表格

当然,PyExcelerator也是有缺点的,它所提供的读写操作方式相对简单,要对已有的Excel文件进行修改,就显得比较麻烦了。

如果要对已有的Excel表格进行较复杂的修改操作,选择PyExcelerator就不太合适了,这时候可以试试另外的方法。比如使用pywin32通过WinCOM来操作Excel表格,或者使用xlrd。

PyExcelerator的官方主页是http://sourceforge.net/projects/pyexcelerator,程序包中并没有太多的教程文档,不过包含了一些简单的示范操作的小例子,如果需要更详细的信息,就只能读源代码了。

这里提一个小例子:

from pyExcelerator import *
 
w = Workbook() #创建一个工作簿
 
ws = w.add_sheet('Hey, Hades') #创建一个工作表
 
ws.write(0,0,'bit') #在1行1列写入bit
 
ws.write(0,1,'huang') #在1行2列写入huang
 
ws.write(1,0,'xuan') #在2行1列写入xuan
 
w.save('mini.xls') #保存

编程开发 Python

Python的SO_REUSEADDR选项存在Bug

2009年4月10日

近日,在XP下使用Python编写了一个需要大量使用TCP链接的程序,程序运行一会儿之后,不断地返回编号10048的系统错误,显示“需要绑定的网络地址/端口已经存在”。

搜索之后发现,这个10048应该是属于Windows系统层面的错误,是在同一地址和端口上绑定socket引起的。一开始以为是没有关闭socket而导致端口耗尽所造成的重用,但是增加了socket关闭的语句之后,错误依然存在。

用netstat深入检查了一下发现,出现10048错误时,有连续的大量端口处于TIME_WAIT状态,这便是10048错误的来源。一个socket即使进行了关闭操作,也会有一段时间处于TIME_WAIT状态,这时如果将另外一个socket绑定到这个端口上,就会出现10048错误。

而在Python中使用socket,Python解释器似乎只会使用某段范围的端口对socket进行绑定,当程序快速地大量创建、关闭socket时,使得这个范围段的端口都处于TIME_WAIT状态,这时弱在创建并使用新的socket,解释器又在这个范围段绑定端口,便会出现10048错误。之前那个程序出错原因便是如此。

在socket网络编程中,本来是有个socket选项可以解决这个问题的,那就是SO_REUSEADDR选项,它允许多个socket绑定在同一个端口上。但是在程序中对每个socket都设置了SO_REUSEADDR选项后,问题还是没有解决。

于是继续Google相关的资料,最后发现这是Python在Windows平台上的一个bug,导致SO_REUSEADDR选项虽然设置了,却没有真正起作用。

在Python官方的Issue Tracker中,这个bug的标题是“SO_REUSEADDR doesn’t have the same semantics on Windows as on Unix”,受影响的版本包括了Python 2.5、Python 2.6和Python 3.0,这个问题目前还没有得解决。

更多的资料请参考官方的Issue Tracker记录,http://bugs.python.org/issue2550

编程开发 Python

SEO Powered by Platinum SEO from Techblissonline