可可熊的窝

Category Archives: Python

读取E680(i,g)的native.db文件-续

IN:Python, 编程相关   Tags: ,    Comments:4

上次写到读E680联系人,后来又增加了读短信,并且做了一些代码上的修改,代码放在了google code里,使用的方法是需要读数据库(native.db)中的什么内容就在databases这个list中添加相应的数据库名,获取数据库名的方法也在代码的首部给出了。

地址

PyFetion也放在了这里,以后Python的脚本就统一用google code管理,这样就方便我在多台电脑修改代码了。

前几天看到一篇文章比较SQLite与Bdb的文章,提到了Bdb中数据存放是使用的原始数据,所以在读到短信中的日期时需要使用struct.unpack来进行处理。

本来以为Bdb也应该是代码很小七的,类似与SQLite,没想到竟然有十多兆的代码:-(
可可熊的Python仓库:

http://code.google.com/p/pytool

————————-google code 中svn使用————————————-
svn checkout https://pytool.googlecode.com/svn/trunk/ pytool –username cocobear.cn
svn status
? cang.py
svn add cang.py
A cang.py
svn ci -m”add cang.py”

02-01
2009

使用Python处理Excel表格

IN:Python, 编程相关   Tags: ,    Comments:10

给俺的boss写的一个小工具,使用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内容进去,而不要写编码过的内容。

给boss的代码:

01-16
2009

读取E680(i,g)的native.db文件

IN:Life, Python, XylFTP   Tags: , ,    Comments:5

E680手机使用了Berkeley DB,关于这个数据库的一些信息可以看我给的链接。

很早以前就有打算要写个Python读取native.db(不知道这个的请G之)中联系人,短信的程序,不过没能成功,这两天又接触到了bsddb,于是今天分析了下这个native.db,没想到原来挺简单的。Berkeley DB本来就是一个很简单的数据库,只是在E680中系统把多个数据库同时存放在了一个文件中native.db,所以不可以直接使用bsddb.btopen来直接打开这个文件。由于Berkeley DB中只是一种类似Python中dict的数据库(key=value)所以要存放手机联系人(有很多字段,如地址,电话…),就需要使用多个数据库,然后每个数据库使用索引来与其它数据库建立联系。按照一般的想法应该是多个数据库的key是作为索引,然后value分别存放各种信息,但E680中的native.db恰好相反。

其实这样的结构也是很简单的,但是我在写代码的时候遇到一个问题,从某个数据库中读取一个key,然后使用bsddb中的get方法去取这个key对应的value,结果确是None,以前好像就是卡在了这一块,似乎与这个value的值有关系,这个value是二进制数据:“< x03x00x00”,不理解为什么这里不直接用整数作为索引而用这么奇怪的数据,或者这里是某种编码?

先不理这个,不管这个value是什么,使用sorted把每个数据库按照其value排序,下面是所有代码:

读取E680联系人:

不到50行就搞定了:-)

关于Stardict的字典

IN:Python, 编程相关   Tags: , ,    Comments:3

前几天看了下sdcv(Console version of Stardict),感觉很不爽,C++的代码,花了好长时间才理清楚那些结构,我觉得使用C语言来写的话可以让代码更清晰、简洁,或者C++也可以写得更好一些。因为本来就是个很简单的东西,从一个文件中读取单词索引,然后与输入比较,最后在另外一个文件里面查到解释,加上一些模糊匹配,如果需要再加上对国际化的支持,就这些东西。

因为打算在我做的东西里面使用字典,想用stardict的字典,找到了一个PyStardict,不过速度太慢了,加载一个11M的字典需要10s的时间,原因是字典的idx文件中存放的索引使用Python需要一个字节一个字节的去判断字符串长短,而sdcv在实现的时候使用的是C++,它里面读idx文件的时候使用到了指针来确实一个字符串的大小,而Python没办法做到,只能一个一个读然后判断是否字符串结束。
sdcv-0.4.2/lib/lib.cpp:629:

        for (guint32 i=0; i<wc; i++) {
            index_size=strlen(p1) +1 + 2*sizeof(guint32);

            if (i % ENTR_PER_PAGE==0) {
                wordoffset[j]=p1-idxdatabuffer;
                ++j;
            }
            p1 += index_size;
        }

谁有什么好的办法吗?

12-31
2008

给PyFetion添加了定时发短信的功能

IN:Python, 编程相关   Tags: ,    Comments:13

其实这个标题可以更“标题党”一些,因为俺发现了一个飞信的小秘密:-),所以标题就可以来个“中国移动飞信惊天大秘密”,或者“中国移动飞信惊人漏洞”:-)

扯完了,说下正经的,本来我还想着使用Linux下的crond与PyFetion来实现定时发送送短信的功能,结果飞信本身就有这样的功能(我原本以为飞信客户端的定时短信功能是客户端完成的),飞信可以向服务器提供定时短信的请求,在客户端里可以设置发送的时间,例如:2008-12-17 08:45,最小间隔为5分钟,只能精确到多少分。如果成功的话会返回一个id,相当于一个任务的编号,在客户端里随时可以查看目前所有的定时任务,也可以向服务器请求删除某个任务,这时就得用到id了。

现在该说那个秘密了,因为客户端里对定时发送时间的控制是本地程序来实现的,所以在我的PyFetion里面就不会有这个限制了,就可以以2008-12-17 08:45:35.929 这样的时间格式来定时发短信,看到后面的毫秒了吗?我可以在一秒钟内每隔一毫秒添加一个定时短信的任务,也就是理论上可以以定时的方式给某一手机以1000条/s的速度发送短信,呵呵,不知道谁的手机比较强大一些,俺来试一试:-)

12-17
2008

web2py–在DreamHost上搭建环境

IN:Python, 编程相关   Tags: , ,    Comments:6

Python做Web开发有很多框架,例如django,webpy,web2py……,大概比较了下,觉得web2py挺合适做小一点的东西,这里有一份官方给出的web2py与其它web框架的比较,我也是因为看完了这个比较后决定学下web2py的。

首先得搭好环境,web2py是以WSGI方式运行,所以可以很方便的部署在DreamHost上,我在wiki里记录了下我搭建的过程,可以在这里看到。

网上没找到有web2py做的完整的东西,比较郁闷,想做个网站,用PHP要完全从头做,太麻烦,相应的框架我又不想去学,Python框架很多,Django好像有点麻烦,webpy不太了解,也不知道有没有成熟的应用,web2py目前看着挺不错的,可惜没什么可参考的。

12-11
2008
Page 4 of 8« First...23456...Last »
loading...