77家的会客2010

月归档: 2009年04月 | 记录数: 9
Python 处理 Excel
Weather:12~20度,多云

 使用Python对Excel进行操作,然后把结果生成一个新的Excel表格,使用到了xlrdpyExcelerator两个库。

 

简单的介绍一下这两个库,先说xlrd,这个库读Excel比较方便,各种方法使用起来也挺方便:

bk = xlrd.open_workbook('your.xls')
sh = bk.sheets()[-1]
上面两句就可以打开Excel表格中的一个sheet,sheets得到的是一个list,存放所有的sheet。
sh.nrows是该sheet中的行数,知道这个后就可以使用for循环来读所有的单元格了:
sh.row(i)[3]这个就代表第i行的第4列。

再看看pyExcelerator,这个用起来有点别扭:

sheets = parse_xls('result.xls')
先打开一个表格,sheets是一个list,包含了所有表格的内容,每一项就是一个sheet,而每个sheet是二元tuple,第一个是该sheet的名字,第二个是一个dict,dict的key是一个二元组,表示单元格的坐标,如(0,0),第一行第一列。
从上面的分析中可以得出要访问Excel中第一个sheet的第一行第一列元素需要:
sheets[0][1][(0,0)]
pyExcelerator也不能得到行列数。

写文件也比较简单:
wb = Workbook()
ws = wb.add_sheet('result')
ws.write(0,0,“hello”)
wb.save('result.xls')
 

写文件时需要注意直接写Unicode内容进去,而不要写编码过的内容。

转载于:可可熊的窝

Python实现IP地址与数值之间互转
Weather:短袖终于可以穿了

   自己写方法:

 def ip2num(ip):
i = 0
result = 0
for num in ip.split("."):
result += int(num)<<((3-i)*8)
i+=1
return result 

def num2ip(num):
li = []
num1 = num>>24
li.append(str(num1))
num2 = ((num>>16)-(num1<<8))
li.append(str(num2))
num3 = ((num>>8)-(num1<<16)-(num2<<8))
li.append(str(num3))
num4 = (num-(num1<<24)-(num2<<16)-(num3<<8))
li.append(str(num4))
return ".".join(li)

其实PY已经有相应的模块了

>>> import socket
>>> import struct
>>> socket.ntohl(struct.unpack('i',socket.inet_aton('192.168.101.2'))[0])
3232261378L
>>> socket.inet_ntoa(struct.pack('i',socket.htonl(3232261378L)))
'192.168.101.2'

Today
Weather:晴,8~18度

 

 

IMG_4288

 

 

IMG_4338

 IMG_4387

 

IMG_4290

 

IMG_4318

 

IMG_4376

 

IMG_4390

 

 

IMG_4412

以上 照片来自 Tracy & Lemon

2009.4.18         DALIAN

.NET连接AS400出现[Safe handle has been closed]错误
Weather:凌晨惊雷,早上大雪,4月15日的恐怖天气

最近在做一个工具,要用.net winform通过IBM.Data.DB2.iSeries(IBM DB2 UDB for iSeries .NET Provider)来连接AS/400服务器进行操作,由于IBM提供的这个工具,是基于Client Access的并且针对.Net2.0的这个工具,实现上在调用AS/400的命令的时候,相当于是通过类似连接数据库来执行一个存储过程的command一样的方式进行的。

一切功能都很好用,现在问题出现在了一个不影响软件使用的条件下,即在进行了一个或一系列操作(有连接AS/400,哪怕故意输错连接口令,连接不上)的情况下,在winform关闭的时候,程序会弹出错误”Safe handle has been closed”。

System.ObjectDisposedException はハンドルされませんでした。
Message=”セーフ ハンドルは閉じられています。”
Source=”mscorlib”
ObjectName=”"
StackTrace:
場所 System.Runtime.InteropServices.SafeHandle.DangerousRelease()
場所 System.Threading.RegisteredWaitHandleSafe.Finalize()

起初,一直以为是自己的程序里重复关闭数据库连接之类的导致的,在仔细查找了代码并且加try…catch测试之后发现,根本不是我程序的问题,因为换了cwbx.dll方式来调用的话,是不会出这个错的,于是上网搜索,CSDN里有人提问过同样的问题,但最后也没说是如何解决的甚至是有没有解决;于是转战英文+日文的搜索,终于在一个日本語ブログ和一个英文BLOG里找到了这个问题的说明,原来是IBM的Client Access的BUG,装上相应的补丁包就可以了。

狠击这里可以下到相应的版本的Client Access的补丁。

装上补丁以后,就会得到一个版本更新的IBM.Data.DB2.iSeries.dll文件,就不会再出现标题内的错误了;另外,cwbx.dll的版本也会被更新。

测试证明,如果把AS400成当一个DB2服务器来用,用IBM.Data.DB2.iSeries.dll是个非常不错的选择,包括可以很好的支持存储过程的调用等;但是如果要从Client(winApp,Web)调用在AS400上编写(COBOL,RPG,CL等)的程序或是直接执行AS400的 CL命令,还是推荐使用CWBX.DLL,可以很好的处理所传的变量 类型及返回结果(包括出力参数,这一点上,前者做得非常差)。当然,如果你愿意,还是可以采用ODBC或OLEDB的方式连接。。。

春暖花开了
Weather:阴天,樱花和玉兰花开了

大连的春天来得晚,来得慢,每次总是尽可能的来表现“乍暖还寒”的意境。

难得的一个周一直还不错的天气,今天周六,温度低了几度,也是小阴着天,但还是无法再阻挡人们出门踏青的想往。

4月了,大连春游的时间到了。看,连窗外的桃花都开了……

IMG_4006

 

第一站,劳动公园。

 IMG_3971
孔雀很给面子,我们到了之后,两只白的一只绿的,相应的开屏;有个有意思的小插曲,人群中竟然有人在说是孔雀要打架了;晕,还有不知道孔雀为什么要开屏的……

 

IMG_4016

满树的樱花已经开满了枝头,樱花最漂亮的,是她开始飘落的时候……

 

再来一张比较有喜感的。

IMG_4027