可可熊D窝

Keep it simple, stupid


  • 首页

  • 关于

  • 标签182

  • 分类8

  • 归档359

  • 搜索

导出抓虾收藏

发表 2009-02-04 | 分类 编程相关 | 评论数:
| 字数: 405 | 阅读 ≈ 1 分钟

整理Python写的小工具,发现这个导出抓虾收藏的工具还比较有用,以前也是一同学让帮写的,也放在google code里面
代码

代码把抓虾收藏中的文章全部导出为html格式的书签,方便导入进delicious等书签。

Comments

laphy: 请问一下,你是怎么知道登录抓虾的网址的?为什么不是浏览器地址栏里显示所显示的http://www.zhuaxia.com/passport/logon呢?还有查看抓虾收藏的地址为什么用http://www.zhuaxia.com/indexFrame.php#showMyTag(-1,20,0,1,0)行不通呢。我只对python有些了解,对网页编程这方便不太懂,是需要网页编程这方面的知识才能懂得以上的问题吗?HTML知识还是javascript? 还望楼主不吝赐教!谢谢!

Amankwah: 呃,还没用过抓虾~

万晓文: 你好,请问这个工作怎么下载哈?

终于能上网了

发表 2009-02-02 | 分类 Life | 评论数:
| 字数: 371 | 阅读 ≈ 1 分钟

从房东说开始拉网线已经过去了整整两个月了,今天终于好了,不过还是遇到了些问题,我这个机子还挑得很,网线插上好一直丢包,半天也没搞清楚是哪儿的问题,电信的人说是网卡有问题,但是换隔壁小伙的网线就没有问题,我自己试了几根网线都不行,折腾了半天,换了个接线盒还是不行,后来电信的人走后我又自己试了一会儿,结果我第一次试的那根网线插上后正常了,实在是很无耐,小心翼翼地把机箱放好,不管了,反正现在是能上了。

Comments

Amankwah: 难怪你突然一下扔出这么多文章~理解了~ 我还以为DP同学玩失踪呢~

可可熊: 现在又上不了了,一会儿通一会儿不通!

c: 你不是1号还说通网早着呢吗?

luguo: 能上就行啊~~恭喜~!

草儿: 同意楼上,别太挑剔了。 好歹晚上能打游戏了,没有女人,有网络也好,呵呵。 PS:我准备配个电脑,给点建议吧

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

发表 2009-02-01 | 分类 编程相关 | 评论数:
| 字数: 687 | 阅读 ≈ 1 分钟

上次写到读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”

Comments

草儿: 里面内容真空,好歹你把以前写的说明文字也一块儿cp过去啊。

dcy: 哈哈,我的也是E680

dcy: 支持大牛写个chm的横屏阅读器,网上只看到竖屏的……

dcy: 忘了说是E680的chm横屏阅读器……

使用Python处理Excel表格

发表 2009-01-16 | 分类 编程相关 | 评论数:
| 字数: 2.9k | 阅读 ≈ 3 分钟

给俺的boss写的一个小工具,使用Python对Excel进行统计,然后把结束生成一个新的Excel表格,使用到了xlrd和pyExcelerator两个库。

简单的介绍一下这两个库,先说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的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
#Author: cocobear.cn@gmail.com

import xlrd
from pyExcelerator import *

city = [(u'山城','[2,3]d+'),(u'水国','4d+'),(u'火县','5d+'),
(u'土城','6d+'),(u'土国','7d+'),(u'火乡','8[1-5]d+'),
(u'水乡','8[067]d+'),]

fname = '0107CRM.xls'
bk = xlrd.open_workbook(fname)
sh = bk.sheets()[-1]
nrows = sh.nrows
#result中按顺序存放各city中各套餐的数量
#顺序为XTa+、XTb、XTb+
result = []
for i in range(len(city)):
result.append([0,0,0])

for r in range(1,nrows):
num = str(sh.row(r)[3])[7:]
flag = False
for i in range(len(city)):
if re.match(city[i][1],num):
flag = True
if sh.row(r)[2].value == 3001.0:
break
name = sh.row(r)[0].value.encode('utf8')
if 'XTa+' in name:
result[i][0]+=1
if 'XTb' in name and 'XTb+' not in name:
result[i][1]+=1
if 'XTb+' in name:
result[i][2]+=1
if not flag:
print "NO:"+num

print result

titles = [u'局向',u'数',u'M录入数',u'X数',…………]
wb = Workbook()
ws = wb.add_sheet('result')
for i in range(len(titles)):
ws.write(0,i,titles[i])

for i in range(len(city)):
ws.write(i+1,0,city[i][0])
ws.write(i+1,1,result[i][0])
ws.write(i+1,4,result[i][1])
ws.write(i+1,7,result[i][2])
ws.write(i+1,10,result[i][0]+result[i][1]+result[i][2])
ws.write(i+2,1,"=SUM(B2:B8)")
wb.save('result.xls')

Comments

草儿: 靠,干嘛把地址写那么清楚啊~

刘鑫: 你比我早,嘿嘿,我正要拿Python处理Excel呢,前几天刚研究了下Excel的COM接口

Kermit.Mei: 这个很有用,我要好好学习一下,呵呵。

Amankwah: Excel格式是公开的?

wind: 看不明白,等我能看明白了再来瞅瞅

vvoody: 只用过 pyExcelerator 写过一个转课表的,还好用。 嗯,编码问题当时确实我好搞了一番。

小慧: 这个文章不错!我刚好需要了解python操作Excel的知识。 希望可以发更多关于python的帖子出来。

可可熊: To:小慧 可以看看PyFetion

9命怪猫: 其实,类似功能,用Excel内置的宏或者函数库就可以搞定了。 Excel比想象中强大得多,只是大家不愿意去发掘!

zhan: Excel内置函數是可以做到大部份的事,但置入一堆函數後,復雜度絕對超過比你自已寫出來的程式累

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

发表 2009-01-13 | 分类 Life | 评论数:
| 字数: 2.4k | 阅读 ≈ 2 分钟

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联系人:

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
#Author: cocobear.cn@gmail.com

"""
获取数据库名:
db = bsddb.db.DB()
db.open('native.db',bsddb.db.DB_UNKNOWN,bsddb.db.DB_RDONLY)
db.keys()
"""

import bsddb

db_file = 'native.db'    
databases = [('姓名','780_contact_table.first name'),('手机1','780_contact_table.mobile1'),('手机2','780_contact_table.mobile2'),('家庭1','780_contact_table.home1'),('家庭2','780_contact_table.home2'),('工作1','780_contact_table.work1'),('工作1','780_contact_table.work1'),]
databases = [('姓名','780_contact_table.first name'),('手机1','780_contact_table.mobile1')]
out = []

for database in databases:
    #进行单文件多数据库操作 需要每次新建一个环境
    #因此下面这行在for循环里
    db =bsddb.db.DB()
    db.open(db_file,database[1],bsddb.db.DB_UNKNOWN,bsddb.db.DB_RDONLY)
    #每次读一个数据库
    #原本数据库中的value是系统的id key是具体有意义的内容
    #下面这行把db.items()得到的list进行反转 为以后有序输出
    out.append(sorted(db.items(),key=lambda (k,v): (v,k)))
    db.close()

#格式化输出
for i in databases:
    print i[0]+":",
print

for i in range(len(out[0])):
    for j in range(len(out)):
        #如果输出内容属于电话号码需要反转
        #根据databases中各位置含义来来判断
        if j in [1,2,3,4,5,6]:
            print out[j][i][0].decode('utf16')[::-1],
        else:
            #非ascii字符使用utf16进行解码
            print out[j][i][0].decode('utf16'),
    print

不到50行就搞定了:-)

Comments

草儿: 楼上在那个那个什么啊,那个了半天还不知道是啥呢…… coco,啥时候咱换HTC的吧~

1069: 我开始用HTC的了,wm的用起来顺手,呵呵。

Amankwah: 我还是不知道~发现智能手机,目前还是Symbian最哪个啥,接下来是WM,Linux还不够哪个啥啊~还需要努力啊~

wind: 我貌似还没用写过一个和我的手机有关的手机程序,呵呵

1…151617…72
cocobear

cocobear

爱折腾的技术宅一枚

359 日志
8 分类
182 标签
RSS
GitHub E-Mail Twitter 豆瓣
友情链接
  • 王聪
  • 老大
0%
© 2007 – 2020 cocobear | 521k | 7:54
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.7.0
Hosted by GitHub Pages