2012年10月17日星期三

python 中文乱码问题深入分析

一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?

在本文中,以'哈'来解释作示例解释所有的问题,"哈"的各种编码如下:
1. UNICODE (UTF8-16),C854;
2. UTF-8,E59388;
3. GBK,B9FE。
一、python中的str和unicode
一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?
在python中提到unicode,一般指的是unicode对象,例如'哈哈'的unicode对象为
u'\u54c8\u54c8′
而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。
例如:python

对于unicode对象哈哈进行编码,编码成一个utf-8编码的str-s_utf8,s_utf8就是是一个字节数组,存放的就是'\xe5\x93\x88\xe5\x93\x88′,但是这仅仅是一个字节数组,如果你想将它通过print语句输出成哈哈,那你就失望了,为什么呢?

因为print语句它的实现是将要输出的内容传送了操作系统,操作系统会根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串"哈哈",输出的是"鍝堝搱",因为 '\xe5\x93\x88\xe5\x93\x88′用GB2312去解释,其显示的出来就是"鍝堝搱"。这里再强调一下,str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。

这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)
二、str和unicode对象的转换

str和unicode对象的转换,通过encode和decode实现,具体使用如下:

decode和encode演示

将GBK'哈哈'转换成unicode,然后再转换成UTF8
三、Setdefaultencoding

python

如上图的演示代码所示:

当把s(gbk字符串)直接编码成utf-8的时候,将抛出异常,但是通过调用如下代码:

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就可以转换成功,为什么呢?在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。

至于reload(sys)是因为Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入。
四、操作不同文件的编码格式的文件

建立一个文件test.txt,文件格式用ANSI,内容为:

abc中文

用python来读取

# coding=gbk

print open("Test.txt").read()

结果:abc中文

把文件格式改成UTF-8:

结果:abc涓枃

显然,这里需要解码:

# coding=gbk

import codecs

print open("Test.txt").read().decode("utf-8″)

结果:abc中文

上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,

运行时报错:

Traceback (most recent call last):

File "ChineseTest.py", line 3, in

print open("Test.txt").read().decode("utf-8″)

UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。

因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:

# coding=gbk

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8″)

结果:abc中文

五、文件的编码格式和编码声明的作用

源文件的编码格式对字符串的声明有什么作用呢?这个问题困扰一直困扰了我好久,现在终于有点眉目了,文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如:

str = '哈哈'

print repr(str)

a.如果文件格式为utf-8,则str的值为:'\xe5\x93\x88\xe5\x93\x88′(哈哈的utf-8编码)

b.如果文件格式为gbk,则str的值为:'\xb9\xfe\xb9\xfe'(哈哈的gbk编码)

在第一节已经说过,python中的字符串,只是一个字节数组,所以当把a情况的str输出到gbk编码的控制台时,就将显示为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的控制台时,也将显示乱码的问题,是什么也没有,也许'\xb9\xfe\xb9\xfe'用utf-8解码显示,就是空白吧。>_<

说完文件格式,现在来谈谈编码声明的作用吧,每个文件在最上面的地方,都会用# coding=gbk 类似的语句声明一下编码,但是这个声明到底有什么用呢?到止前为止,我觉得它的作用也就是三个:

声明源文件中将出现非ascii编码,通常也就是中文;
在高级的IDE中,IDE会将你的文件格式保存成你指定编码格式。
决定源码中类似于u'哈'这类声明的将'哈'解码成unicode所用的编码格式,也是一个比较容易让人迷惑的地方,看示例:

#coding:gbk

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

将这个些代码保存成一个utf-8文本,运行,你认为会输出什么呢?大家第一感觉肯定输出的肯定是:

u'\u54c8\u54c8′

ss:哈哈

但是实际上输出是:

u'\u935d\u581d\u6431′

ss:鍝堝搱

为什么会这样,这时候,就是编码声明在作怪了,在运行ss = u'哈哈'的时候,整个过程可以分为以下几步:

1) 获取'哈哈'的编码:由文件编码格式确定,为'\xe5\x93\x88\xe5\x93\x88′(哈哈的utf-8编码形式)

2) 转成 unicode编码的时候,在这个转换的过程中,对于'\xe5\x93\x88\xe5\x93\x88′的解码,不是用utf-8解码,而是用声明编码处指定的编码GBK,将'\xe5\x93\x88\xe5\x93\x88′按GBK解码,得到就是"鍝堝搱",这三个字的unicode编码就是u'\u935d\u581d\u6431′,至止可以解释为什么print repr(ss)输出的是u'\u935d\u581d\u6431′ 了。

好了,这里有点绕,我们来分析下一个示例:

#-*- coding:utf-8 -*-

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

将这个示例这次保存成GBK编码形式,运行结果,竟然是:

UnicodeDecodeError: 'utf8′ codec can't decode byte 0xb9 in position 0: unexpected code byte

这里为什么会有utf8解码错误呢?想想上个示例也明白了,转换第一步,因为文件编码是GBK,得到的是'哈哈'编码是GBK的编码'\xb9\xfe\xb9\xfe',当进行第二步,转换成 unicode的时候,会用UTF8对'\xb9\xfe\xb9\xfe'进行解码,而大家查utf-8的编码表会发现,utf8编码表(关于UTF- 8解释可参见字符编码笔记:ASCII、UTF-8、UNICODE)中根本不存在,所以会报上述错误。

Python open读写文件实现脚本

Python中文件操作可以通过open函数,这的确很像C语言中的fopen。通过open函数获取一个file object,然后调用read(),write()等方法对文件进行读写操作。


1.open

使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )

注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
2.读文件
读文本文件
input = open('data', 'r')
#第二个参数默认为r
input = open('data')

读二进制文件
input = open('data', 'rb')

读取所有内容
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )

读固定字节
file_object = open('abinfile', 'rb')
try:
while True:
chunk = file_object.read(100)
if not chunk:
break
do_something_with(chunk)
finally:
file_object.close( )

读每行
list_of_all_the_lines = file_object.readlines( )

如果文件是文本文件,还可以直接遍历文件对象获取每行:
for line in file_object:
process line

3.写文件
写文本文件
output = open('data', 'w')

写二进制文件
output = open('data', 'wb')

追加写文件
output = open('data', 'w+')

写数据
file_object = open('thefile.txt', 'w')
file_object.write(all_the_text)
file_object.close( )

写入多行
file_object.writelines(list_of_text_strings)

注意,调用writelines写入多行在性能上会比使用write一次性写入要高。

sed圣经

1.练习文件

cat datafile
northwest         NW           Charles Main             3.0      .98    3     34
northern          WE           Sharon  Cray             5.3      .97    5     23
southnorth        SW           Lewis   Dalsass          2.7      .8     2     18
southern          SO           Suan    Chin             5.1      .95    4     15
southeast         SE           Particia Hemenway        4.0      .7     4     17
eastern           EA           TB      Savage           4.4      .7     4     20
northeast         NE           am      Main JR.         5.1      .94    3     13
north             NO           Margot   Weber           4.5      .89    5      9
central           CT           Ann      Stephens        5.7      .94    5     13
wangdongsheng     ST           Neu     Soft             8.8      .77    6      5

2. sed '/north/p' datafile 
默认情况下sed会打出全部的,如果在某一行匹配到模式north ,sed会多打一遍此行.

3. sed -n 'north/p' datafile  
-n 与p命令配合使用,sed 取消了sed的缺省打印动作,如果不指定n这个选项,
sed就会从复打印north选项,如果指定了n就只打印模式north的那几行.

4. sed '3d' datafile
d命令就是删除第3行内容。

5.sed'3,$d' datafile
删除第3行到最后一行的内容。

6. sed '$d' datafile
删除最后一行.

7. sed '/north/d' datafile
删除包含所有行的north;其他的打印出来

8.sed 's/west/north/g' 
把所有的west替换成north

9.sed -n 's/^west/north/p' datafile
搜索行首带west的行,并将替换为north,并打印出来

10.sed 's/[0-9][0-9]$/&.5/' datafile
与符号(&)在替换穿中时,代表查找串中匹配内容。这个例子中以两位数字结尾的行后面都被加上.5如果要在替换串中表示"与"号字面的含义,就要对起进行转义,记为:\&

11. sed -n 's/Hemenway/Jones/gp' datafile
文件中出现所有Hemenway都被替换为Jones,唯一发生变化的行被打印.选项-n与p的组合取消了缺省的输出,标志g含义在行内进行全局替换。

12. sed -n 's/\(Mar\)got/\lianne/p' datafile
扩在括号里的模式Mar作为标签1被保存与特殊寄存器中,替换串通、1引用它,Margot被替换为Marianne.

13. sed 's#3#88#g' datafile
紧跟在S命令的字符是查找和替换之间的分隔符。分隔符缺省的正斜杠,但可以改变(只在使用s命令时).无论什么字符,只要紧跟着s命令就成新的串分隔符,这个方法在查找包含正斜杠的模式时很管用,例如查找路径名和生日.

14. sed -n '/west/,/east/p' datafile
打印在west和east之间的所有行,如果west出现在east之后的某一行,则打印的范围从west所在行开始,到下一个出现east的行或文件末尾。

15. sed -n '5,/^northeast/p' datafile
打印前5行到第一个以northeast开头的行之间的所有行.

16 '/west/,/east/s/$/***WANGDONGSHENG***/' datafile
修改模式east和west之间的所有行,将各行的行尾($)替换为字符串***WANGDONGSHENG***换行符号被移动到这个新的字符串后面,箭头标出了范围.

17. sed -e '1,3d' -e 's/Hemenway/Jones' datafile
-e的作用是先删除1到3行,然后把Hemenway替换Jones,因为这是逐行编辑的(即两个命令都在模式空间上执行),所以编辑的顺序会影响结果.例如如果两条命令都是执行替换,则前一行替换会影响后一行.

18.sed -n '/north/w newfile' datafile
w命令是把指定写入文件。文件datafile中所有包含模式north的行都写到文件newfile中

19.sed '/^north  /a\\---->the north sales district has moved<---' datafile
a为追加命令,字符串the north sales district has moved被加在以north开头,north
后跟一空格的各行之后,用于追加文本必须出现在追加命令下一行上.

20.sed '/eastern/i\\NEW REGLAND REGION\\---------------------------' datafile
i命令是插入命令。如果某一行匹配到模式eastern,i命令就在该行上放插入命令中反斜
杠后的文本,除了最后一行,用于插入文本中每一行都必须以反斜杠结尾

21.sed '/eastern/{ n; s/AM/Archie/; }' datafile
如果在某一行匹配到模式eastern,n命令就是指sed用下一个输入行(即包括AM Main Jr 的那行)
替换模式空间中的当前行,用Archie替换(s)其中的AM,然后打印

22. sed'1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ' datafile
y命令把第一到第3行所有小写字母换成大写字母。正则表达式对y不起作用.

23 sed '5q' datafile
打印第5行之后,q命令让sed程序退出

24 'Lewis/{ s/Lewis/Joseph/;q; }' datafile
在某行匹配模式到Lewis时,先用Joseph替换(s)Lewis然后q命令退出

25 sed -e '/northeast/h' -e '$G' datafile
如果在某一行找到模式WE,h命令就将该行从模式缓冲区拷贝到一个暂存的缓冲区
保存在暂存缓冲区的行可以在以后被重新取出(使用命令G或g),这个例子中,当模式WE
被找到时将模式缓冲区的那份拷贝删除,

26.sed -e '/WE/{h; d; }' -e '/CT/{G; }' datafile
sed处理文件时,会把文件每一行都保存在一个临时的缓冲区中,这个缓冲区会被称为模式空间。sed处理每一行后,都会将其打印在屏幕上,除非该行被删除会被取消。之后模式空间清空,下一输入行等待处理。本例子中,被包含的模式northeast的行被找到之后,就被保存在模式空间里h命令把复制并保存到另一个缓冲区,这个特殊的缓冲区是暂存的缓冲区(holding buffer)在第二条sed命令中,sed读到最后一行($)时,G命令指示它从暂存缓冲区读出一行,将其放回模式缓冲区,追加在模式空间内当前行(本例中是最后一行)的后面

sed 's/^[]*//g' filename

sed 's/^ *//g' filename

sed 's/^[[:space:]]*//g' filename 

删除以.结尾行 s/^.$//g

删除以一个以上空格,用一个空格代替 s/[][][]*/[]/g

删除空行 /^$/d

删除第一个字符 s/^.//g

删除所有空格并用Tab键代替 s/[]/[ ]//g

删除行首所有Tab键 s/^[ ]//g

删除所有Tab键 s/[ ]*//g

2012年8月28日星期二

秋天到了

夜阑听窗外风声

2012年8月26日星期日

打扫卫生梳理自己

一个月了,房间里乱的很,是要打扫打扫卫生了。正值今天的大好天气,洗洗衣服晒晒被子,蛮好的。一些零碎的东西趁这个机会也收拾整理一下。
这周没有骑车子到外面去玩,因为感觉背疼。可能是由于Agile培训期间被海伦宾馆的空调吹坏了!!!
同事说背疼是寒气太重,跑跑步出出汗就能好了。于是乎,微博上几个同事相互监督有没有锻炼,真的有点全民运动的感觉~一个习惯的养成需要21天,大家加油吧!
确实,工作后运动的少,身子骨大不如以前了。
入职四个月多了,是应该要给自己做个评估和总结,可是我还是很难克服外界对我计划的影响,很多事情一直在拖着…比如学习Python学习通信基础知识和WCDMA,还有SM一直建议学习英语考雅思出国,还有说了好多次要和同学聚会都耽搁了…
接下来国庆的黄山骑行以及申请公司甘肃志愿者都要提前做好准备。
当然也在和一个女生拍拖,哎,什么时候是个头啊
很高兴的是,组里有好几个同事看到我加入了爱德重返校园计划,都很想和我一起资助小学生,真的,我倍感欣慰~~
好了,去打扫卫生了,上天赐予我们最好的礼物就是时间了,我们要好好珍惜,并把它用在有意义的事情上

It is a start

Do scrum, like Agile, in practice

2012年8月13日星期一

质量管理

一个替人割草打工的男孩打电话给一位陈太太说:"您需不需要割草?"
 
陈太太回答说:"不需要了,我已有了割草工。"
 
男孩又说:"我会帮您拔掉花丛中的杂草。"
 
陈太太回答:"我的割草工也做了。"
 
男孩又说:"我会帮您把草与走道的四周割齐。"
 
陈太太说:"我请的那人也已做了,谢谢你,我不需要新的割草工人。"
 
男孩便挂了电话,此时男孩的室友问他说:"你不是就在陈太太那割草打工吗?为什么还要打这电话?"
 
男孩说:"我只是想知道我做得有多好!"
 
1.     这个故事反映的ISO的第一个思想,即以顾客为关注焦点,不断地探询顾客的评价,我们才有可能知道自己的长处与不足,然后扬长避短,改进自己的工作质量,牢牢的抓住顾客。
 
2.     这也是质量管理八项原则第6条:"持续改进"思想的实际运用的一个例子。我们每个员工是否也可结合自己的岗位工作,做一些持续改进呢?
 
3.     不光是营销人员,所有的员工都可以做到让顾客满意。对于营销人员来说这样是可以得到忠诚度极高的顾客。对于我们每个职能部门员工来说,只有时刻关注我们的"顾客(服务对象)",工作质量才可以不断改进。
 
4.     这也是沟通的问题,一个人想得到公正,客观的评价真的好难。这个故事是否为我们提供了一个好的方法呢?应该算是一种创新吧。(冒充别人打电话给客户,看看是否有些地方可以改进)
 
这样的主动服务意识确实很值得大家学习,如果能主动查找问题并解决问题,那才是完美的质量管理模式。
 
 
 

2012年8月9日星期四

丰县高层次人才引进实施办法

中共丰县县委 丰县人民政府关于印发《丰县高层次人才引进实施办法》的通知

2010-07-20 16:55:19

 

中共丰县县委 丰县人民政府
 
关于印发《丰县高层次人才引进实施办法》的
 
通     知
 
 丰委发〔2009〕14号
 
 
各镇党委、政府,县经济开发区党工委、管委会,县委各部委,县各委、办、局,县各直属单位:
《丰县高层次人才引进实施办法》已经县委、县政府同意,现印发给你们,希认真遵照执行。
 
 
中共丰县县委
丰县人民政府
〇〇九年二月十七日
 
主题词:人才 引进   实施办法                       
中共丰县县委办公室             2009年2月11日印发 
                                             此件共印150份
 
 
丰县高层次人才引进实施办法
    
第一章 总则
第一条  为加快实施人才强县战略,大力引进和培养高层次创新创业人才,加快建设一支结构合理、素质全面、引领潮流的高层次创新创业人才队伍,促进我县经济社会快速、健康、协调发展,本着"政府引导、单位自主、突出重点、合理配置"的原则,现结合我县实际情况,制定本办法。
第二条 高层次人才引进工作在县人才工作领导小组领导下开展,县人才工作领导小组办公室搞好统筹协调,县人事局负责组织实施,县人才工作领导小组成员单位以及其他有关部门按照职能分工密切配合。
第二章 引进对象
第三条 本办法引进的人才是指全县企事业单位从县外(不论原籍是否为丰县)引进的具备下列条件之一的人员:
1、国家级学术带头人、享受政府特殊津贴、获得省(部)级"有突出贡献中青年专家"称号及其以上人员。
2、取得硕士以上学位或具有副高级及以上专业技术职务任职资格的人员。
3、具有本科学历并获得学士学位或具有中级专业技术职务资格,且为县紧缺、急需专业的人员;通过公开招聘无法引进的专业技术人员或企业经营管理人员。
4、拥有发明专利及高新技术成果转化项目、专有技术(具有国内〈外〉领先水平或填补国内〈外〉空白项目)到丰县创办、合办、承包、租赁企业,并能产生较好的社会和经济效益的人员。 
第三章 相关待遇
第四条 凡符合本办法第三条规定的高层次人才在本县企事业单位工作并经确认且签定三年以上聘任合同或服务协议的由县财政给予相应的补贴。
1、符合引进对象第三条第1类的高层次人才,工作满三年的享受6万元补贴。
2、符合引进对象第三条第2类的高层次人才,工作满三年的享受3万元补贴。
3、符合引进对象第三条第3、4类的高层次人才,工作满三年的享受1.5万元补贴。
第五条 对符合省高层次人才引进条件的,优先推荐申报"江苏省高层次创新创业人才引进计划";对符合省"六大人才高峰"(教育、医药卫生、电子信息、汽车、建筑、农业)急需高层次人才的,由县组织人事部门推荐,申请省高层次人才项目专项资助资金。
第六条 建立高层次人才社会保障服务机制
1引进的高层次人才因特殊情况不能调转人事关系的,可以重新建立档案,并由县人才服务中心核准其原有身份、学历、工龄、技术职称等。
2、高层次人才在企业服务的,在服务期限内,企业应为高层次人才按其最高工资标准办理养老、医疗、工伤、生育、失业保险和住房公积金。
3、引进的高层次人才,其配偶可随调,子女可随迁。配偶已就业的,按"对口对应"原则予以接收安排。其随迁子女属义务教育阶段学生,可选择学校就读。
4、第三条第1-2类的人才落户我县,县财政给予一次性安家补助费20万元;第三条第3类的人才落户我县,县财政给予一次性安家补助费10万元;第三条第4类的人才落户我县,县财政给予一次性安家补助费5万元(以上各类安家补助费分三年发放,每年底发放补助费总额的1/3)。
5、成立丰县高层次人才引进办公室,办公室设在县人事局。设立高层次人才引进专项资金,县财政每年安排100万元,专项用于引进高层次人才工作,今后每年根据高层次人才工作需要,按相应比例增加财政拨付额度,实行滚动使用,确保高层次人才引进工作经费开支。专项资金由财政局根据县人才工作领导小组审定名单拨付。
6设立"丰县杰出人才奖",作为我县综合性最高荣誉奖。对我县经济社会发展作出杰出贡献的创新创优人才,由县委、县政府授予"丰县杰出人才奖"荣誉称号,该奖项每三年评选一次,每人奖励10—50万元。奖励资金由财政局根据县人才工作领导小组审定名单拨付。
第四章 引进办法
第七条  引进高层次人才办理程序:
1拟引进的高层次人才须填写《丰县高层次人才引进登记表》一式五份,并提供相关证明材料,由用人单位报主管部门初审签署意见,然后报县高层次人才引进办公室审核。
2县人才工作领导小组组织用人单位和相关部门专业人员对拟引进的高层次人才进行审核,出具综合审核材料。
3县人才工作领导小组召集组织、人事、编制、科技、公安、教育、卫生、劳动保障和财政等部门研究审定,审定后由县组织人事部门给予办理相关手续。
第八条  事业单位引进高层次人才,空编单位可在空编数额内直接考核签约,并按上述程序办理报批手续。对现已满员或超编单位要求引进高层次人才的,可从其他单位调剂编制,办理入编手续。鼓励企业引进高层次人才,引进人才其人事关系挂靠在县人才服务中心,可占用专项事业编制,保留事业单位档案工资,安排在企业工作。
第九条  引进高层次人才来丰县工作,采取刚柔结合的方式,坚持"来去自由、双向选择、人尽其才、形式多样"的原则,可以采取调动、聘用、兼职、停薪留职、辞职等多种形式到我县短期或长期工作;也可携带项目或资金创办、领办企业,通过技术入股、承包经营、合作开发、咨询顾问、成果转让和研究开发等形式到我县工作。
第十条  辞职来丰县工作的高层次人才,用人单位应与本人签订聘用合同,经县高层次人才引进办公室审核同意,给予建立原来工作关系或重新办理录用手续;在原单位被辞退或自动离职来丰县工作的,人事关系一律挂靠县人才服务中心,实行人事代理,一年后经用人单位考核并同意续聘的,给予办理恢复原有身份手续,工龄连续计算。上述人员人事档案不能转递的,由县人才服务中心根据有关证件重新为其建立人事档案。
第五章 相关要求
第十一条  高层次人才进入我县工作的,由用人单位委托县人才服务中心实行人事代理,同时高层次人才必须与用人单位签订不少于三年期限的聘用合同或服务协议,并经县人事部门鉴证。
第十二条  用人单位与引进的高层次人才签订聘用合同或服务协议时,必须明确用人单位与引进的高层次人才双方的权利义务,双方严格履行聘用合同或服务协议约定内容。引进的高层次人才违反合同或协议的,由用人单位提议并经县组织人事部门批准并报县高层次人才引进办公室备案,取消其相关优惠待遇;履行合同或协议中发生纠纷时,由县高层次人才引进办公室调解,调解不成的,由县人事争议仲裁委员会或劳动争议仲裁委员会依法仲裁。
第十三条  县人才工作领导小组办公室要搞好统筹协调,县人事局要做好高层次人才的引进工作,尽可能地简化手续,尽快引进人才,搞好人事代理,为用人单位和引进的高层次人才提供优质、高效的服务。
  第十四条  县财政局要积极为引进高层次人才的各项经费提供好保障,做好引进人才各项资助或补贴的发放工作,同时做好引进高层次人才有关费用的核拨和跟踪检查工作。
第十五条  其他各部门、各单位要建立单位领导与引进的高层次人才联系责任制度,给他们提供良好的工作、学习和生活环境,做到政治上关心,思想上沟通,工作上支持,生活上照顾,充分听取他们的意见和建议,为他们多出成果,出好成果创造良好的条件。                                   
第六章 附则
第十六条 本办法自发文之日起实施,以前有关规定凡与本办法不一致的,以本办法为准。
第十七条 本办法由县人才工作领导小组负责解释

如何为 Win32 使用 Perl 的 Excel 的自动化

如何为 Win32 使用 Perl 的 Excel 的自动化

开发人员熟悉如何使用 Perl 可以利用自动化功能在 win32 应用程序 (如 Microsoft Office 相结合的 Perl 中。这篇文章提供了一些示例 Perl 代码将数据发送到 Microsoft Excel,然后创建图表和数据透视表。

在执行之前的所有 Perl 脚本,需要有 Perl,您的计算机上安装和配置。自由地分发 Perl,因为任何人都可以提供 Win32 Perl 的实现。通过活动,以前称为 ActiveWare,Mortice 字距微调系统 (MKS) 提供了两个常用端口的版本。此示例使用 Win32 为活动状态的 Perl。

请按照以下步骤来创建和运行该示例:
  1. 如果您不具有您的计算机上安装的最新活动的 ActivePerl 包并想要试用该示例,请将其从下载:
  2. 启动 notepad.exe,并创建一个名为 perlxl.pl,用下面的 Perl 脚本的新文件:
      use Win32::OLE;    # Start Excel and make it visible  $xlApp = Win32::OLE->new('Excel.Application');  $xlApp->{Visible} = 1;    # Create a new workbook  $xlBook = $xlApp->Workbooks->Add;    # Our data that we will add to the workbook...  $mydata = [["Item",     "Category", "Price"],              ["Nails",    "Hardware",  "5.25"],             ["Shirt",    "Clothing", "23.00"],             ["Hammer",   "Hardware", "16.25"],             ["Sandwich", "Food",      "5.00"],             ["Pants",    "Clothing", "31.00"],             ["Drinks",   "Food",      "2.25"]];    # Write all the data at once...  $rng = $xlBook->ActiveSheet->Range("A1:C7");  $rng->{Value} = $mydata;    # Create a PivotTable for the data...  $tbl = $xlBook->ActiveSheet->PivotTableWizard(1, $rng, "", "MyPivotTable");    # Set pivot fields...  $tbl->AddFields("Category", "Item");  $tbl->PivotFields("Price")->{Orientation} = 4; # 4=xlDataField    # Create a chart too...  $chart = $xlBook->Charts->Add;  $chart->SetSourceData($rng, 2);  $chart->{ChartType} = 70; # 3D-pie chart  $chart->Location(2, "Sheet4");    # Wait for user input...  print "Press <return> to continue...";  $x = <STDIN>;    # Clean up  $xlBook->{Saved} = 1;  $xlApp->Quit;  $xlBook = 0;  $xlApp = 0;    print "All done.";  					
  3. 键入perlxl.pl ,从命令行中的目录,您可在其中创建该文件,或者从资源管理器中双击它。Microsoft Excel 启动时,您应该可以看到和使用数据透视表和图表创建新工作簿。

STG iLab Test Engineer in Shanghai China

STG iLab Test Engineer in Shanghai China

STG iLab Test Engineer


Job ID STG-0465581 Job type Full-time Regular
Work country China Posted 31-Jul-2012
Work city Shanghai Job area Software Development
Travel No travel Job category Software Development & Support
Business unit ClntAdvTechSpt Job role Software Test Specialist
Job role skillset General
Commissionable/Sales-Incentive jobs only No

Job description
Required Skills:
• Administration, system management and test skills on Windows, Linux, VMware, or UNIX.
• Proficient in Perl, bash, Shell, TCL, Python.
• Familiar with OS virtualization concepts for VMware, Hyper-V and KVM are plus
• Experience in OS clustering is a plus.
• Experience of test automation is plus especially Perl.
• Experience in SAN and Storage Systems is a plus.
• More than 1 years of test engineering with hands-on experience.
• Excellent communication skills and good team-work are mandatory. Good verbal and technical writing in English.
• Great passion to the business. Have strong ownership and problem solving skills.
• Bachelor or Master's Degree, major in CS related /EE related.

Responsibilities:
Work with IBM US Team together on Interoperability test for IBM systems/storage.

Main responsibilities:
• Test environment setup, including OS deployment, driver and software installation, firmware update, SAN switch and storage configuration, etc.
• Test plan review and understanding. Read the test plan of every test cycle and understand the test configurations and test strategy. Review the test plan and bring forth constructive suggestions.
• Test execution. Understand about the test scenarios and test variations, execute test cases under given schedule.
• Test automation. Understand test architecture and test automation architecture. Can apply test automation knowledge for test automation design and implementation, including popular tools in test automation, test automation design, test scripts development; maintain and improve existing test scripts and automation framework.
• Trouble shooting and test debugging. Have good skills with systematical method to trouble shoot problems in daily test configuration and test execution, rich experience to do defect debugging.
• Strong communication skill during interlock with development team and problem tracking following IBM development process.
• Have good self-management for assigned tasks and has capability to deliver it on time with high quality

Required

* Bachelor's Degree
* English: Fluent
* Chinese simplified: Fluent

Preferred

* Master's Degree

IBM is committed to creating a diverse environment and is proud to be an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to race, color, religion, gender, gender identity or expression, sexual orientation, national origin, genetics, disability, age, or veteran status.

2012年8月6日星期一

图解HTTPS

HTTPS简介
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的,且看下图。
图解HTTPS - 如何进行加密,解密,验证
1. 客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server443端口。
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4. 客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原
8. 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
 
 

2012年7月23日星期一

[骑行]长途骑行指南

[骑行]长途骑行指南

  长途骑行,一般指里程不少于1000公里,或时长不少于一星期的骑车旅行。在进行长途骑行之前,应该作好充分的准备。硬件方面要选辆好车,并进行必要的调试;储备常用的修理工具;带足合适的服装和必需品。软件方面则需要提高骑行技术和技巧。

选车

  长途骑行最好选择专门为长途旅行设计的27英寸平把全地貌车,这种车前后均有车架,21速,可载重150公斤(含骑行者体重),且车带可根据路面和载重情况在1.25-1.50之间自由选择。不过这种车在目前的国内市场上很难买到,多半从国外带入。

  国内较为普遍的是26英寸21速山地车,这种车可载重120-150公斤,车带在1.50-1.75之间调整,有后架和3个水壶架,也可加装前架和更多水壶架。

  如果骑行路况多为柏油公路,也可选择27英寸普通弯把细纹旅行车,这种车车带宽度为1.25,有后架,非常轻快,比较适合载重量不大的长途骑行。

调试

  普通骑行者喜欢享受边骑边看、自由自在的乐趣,所以速度不是很重要,关键是方便、舒适,所以应按这个要求调车。

  车座:骑行者腋部放在车座中轴线,伸手触摸轮盘轴心,以摸到为准,这就是最适合骑行者的车座高度。
  车把:一般与车座调成同一水平面,高低差不超过半寸;再检查转动是否连惯,前后制动是否灵敏,即可。
  车胎:可以在前后带内胎里放一些补漏液,一旦发现漏气,迅速检查并拔除刺入物,并将破孔朝地,充足气便可自动补胎;或者在内带与外带之间放一条较厚的帆布,也可以防止破胎。

修理工具

  一般来说,只要在旅行前准备充分,车辆也调试正确,一路上基本不会有太大问题。为了方便起见,也可应携带一些修理工具和备用零件。如剪刀、小木锉、多用搬手、旅行气筒、胶水、剪锉好的小块胶皮,内带、外带各一条等。

服装

  长途骑行宜选择夏天,最好穿着流线型紧身设计的短装骑行服,不会增加阻力。骑行裤宜选用内有真皮垫或仿真皮垫的,透气耐磨。如果出行地区当时是雨季,还应考虑防雨功用。目前市面上既保温又挡风防雨的骑行服,多半价格昂贵,骑行者可量力而行。如果没有准备专门的骑行服,特别是骑行裤,也可以用高弹力的平滑短裤代替,里面不要再穿任何服装,并在与身体经常磨擦的部位,涂上凡士林等润滑油。如果突遇天气骤冷,还可以在前胸塞入一两张旧报纸,保温效果极佳。

  为了挡风和小飞虫,还应该戴上骑行眼镜。无色镜片适用于阴天;深色镜片可阻挡紫外线;而浅黄色镜片则是专门为夜间骑行设计的。

  有些外国人喜欢在骑行时戴头盔,以求发生意外时保护头部,对于中国人来说,骑行小帽更实用,更舒服,也更经济实惠。

  长途骑行还可以佩戴手套或脚套,手套防滑防磨,脚套可以帮助骑行者保持正确的骑行姿式,节省体力。不过,不建议不习惯使用手套、脚套的骑行者使用,以免弄巧成拙。

骑行技术技巧

  长途骑行,首先是控制速度,保持体力。掌握速度和体力,可用鼻腔呼吸为参照,如果需要用口呼吸,就表示强度过大或身体疲惫,这时应当减速,调整变速器。上坡时,不应一下子变换好几个档位,频繁调整变速器,这会让疲惫的身体更累;下坡时可适当放松身体,但应注意速度过快时,使用后闸协助制动减速。非紧急情况,不要把闸捏死,否则外带磨损会很大。此外,在长途骑行之前,最好利用节假日做些一、两天的短途骑行,以逐步适应,熟能生巧。

2012年7月20日星期五

好像是在招自动化测试工具吧


2012年7月19日星期四

PAMIE- Python实现IE自动化的模块

PAMIE- Python实现IE自动化的模块(附 网易注册代码) 收藏 
PAMIE是一套为Python写的用于Web自动化测试的工具,采用Win32COM的方式操作IE来实现。
pamie是个很好的操作IE的模块
用pamie来操作ie浏览器好方便啊,本来它就是一个IE测试自动化的东西,
这样,用pamie来抓取网页,自动提交表单很容易。

使用:
来测试一个最简单的例子:


from cPAMIE import PAMIE

ie = PAMIE()

ie.navigate("google.com")
ie.textBoxSet('q','python')
ie.buttonClick('btnG')
ie.linkClick('Python Programming Language -- Official Website')
ie.windowChange('Python Programming Language -- Official Website')
ie.windowFind('Python Programming Language -- Official Website')
ie.textBoxSet('q',"Automation")
ie.buttonClick('submit')


直接操作页面上的form元素,访问页面的文本信息,来判断用户登陆是否成功。


pamie中怎样处理中文标题的弹出对话框?
http://www.python-forum.org/pythonforum/viewtopic.php?f=17&t=3194 
http://markmail.org/message/u3ojkyj2ns7p3dn3#query:+page:1+mid:5wuwfctervph6tlv+state:results 
python:

import cPAMIE, cModalPopUp, winGuiAuto
import time

ie = cPAMIE.PAMIE()
wga = winGuiAuto

# 登录
ie.navigate('D:\\python\\WebDialogTest\\1.html')

#启动新的进程,自动点击"取消"
clickCancel = cModalPopUp.handlePopup("Confirm","取消")
clickCancel.popupName = "选择文件"
clickCancel.start()

ie.buttonClick("install")
time.sleep(1)

clickCancel.join() #进程结束

-------------------------------------------------------------------------------------------------------------------------------------

另外一篇介绍:

PAMIE 是一个很有意思的模块。它是一个实现IE自动化的模块。在此之前我使用过ClientCookie这个模块,它可以使用urllib2来通过程序访问页面,并且很适合在需要cookie支持的环境中。不过,有些web的访问过程并不仅仅是下载文件这样的事情,有时是一系统的动作。PAMIE应该是一个更直观,更简单的模拟手工输入的过程。不过,局限就是它只支持IE,在某些特殊情况下还是可以的。

使用它的话你需要安装win32all模块。

下面是它的readme 提供的一个简单示例:

import cPAMIE

ie= cPAMIE.PAMIE()

# Start Script:

ie.Navigate ('http://pamie.sourceforge.net/pamieform.html')
ie.SetTextBox('John','firstname',0)
ie.SetTextBox('Doe','lastname',0)
ie.SetTextBox('1020 State Street','Addline1',0)
ie.SetTextBox('Suite #16','Addline2',0)
ie.SetTextBox('San Mateo','city',0)
ie.SetListBox('CA','state',0)
ie.SetTextBox('90210','zip',0)

ie.ClickButton('Submit',0)

那么在我们下载完这个模块之后,它是一个zip包。它没有做成安装模式,可以自行将cPAMIE.py拷贝到python安装目录下的lib子目录中即可。上面的代码很简单,先导入cPAMIE模块,然后生成一个自动化对象ie。这时我们会看到程序自动打开一个ie窗口,我们的操作可以在这个ie窗口中看到,执行的部分以黄底显示。

ie.Navigate()用来访问一个链接。
ie.SetTextBox()用来设置一个文本域的值。第一个参数为输入的值,第二个参数为对应的form表格的Input域的名字(这一点需要查看源码才知识),第三个是form的名字(示例为0表示下标)。
ie.SetListBox()用来设置列表框的值。
ie.ClickButton()用来模拟点击按钮。第一个参数是按钮的名字,第二个参数为0表示下标。

在PAMIE主页中写出了一些可用的其它的方法,如ClickLink()。它的第一个参数为链接对应的文本,如果是中文,转成unicode即可。如页面是GB2312,链接源码为:

<a href="http://xxx.com">汉字</a>

调用如下:

ie.ClickButton(unicode('汉字', 'cp936'))

在实际运行中可能不需要这样,只要参数是unicode编码即可。

同时如果你查看源码,还可以看到一些其它的方法:

Quit() -- 关闭打开的ie
GoBack() -- 后退
Refresh() -- 刷新

大家有兴趣可以试一试,一边操作一边就可以看到结果,很简单也很方便。

-------------------------------------------------------------------------------------------------------------------------------

第三个文章介绍

简单明了的Python,第三方提供的模块或称组件 module 等 也很简单明了的

下面是 一个 例子所列举的功能较全了 代码加注解...

# -*- coding: cp936 -*-
import sys

#我把cPAMIE等 pamie2.0里的所有文件放在了 如下路径的 名为pamie 的文件夹里了 加进sys.path方便import 出所有pamie文件夹里的 模块
#只要能import CPAMIE 这里的例子就可运行了呵呵
sys.path.append(r"F:\Python25\lib\site-packages\pamie")
import cPAMIE

#new 实例
ie= cPAMIE.PAMIE()

#打开目标网页

ie.navigate ('http://pamie.sourceforge.net/pamieform.html')

#注意下面所列的 第一个参数如 fistname 等 都是 网页源代码里的 input name="firstname"
#里找出来的,不能用 网页上看见的黑体字: "First Name:"
#填文本框
ie.textBoxSet('firstname','JustThisName')

ie.textBoxSet('lastname','Iamhere')

#先择下拉菜单:

ie.listBoxSelect('state',"MS")

#方形选择框:

ie.checkBoxSet('cxbx',1) #1 2 3 或 * 号等都是 "勾选"的意思 '' 空字符串代表取消选择

#圆形选择框: 英语是 radio 做过网页设计就容易知道这些元素的命名了
#这里选择 Jazz
ie.radioButtonSet("music","Jazz") # music是这个 选择列表的名字,从网页源代码里找出


#最后提交按钮

print "now 提交按钮,只要再Python解释器里输入下面这句就 提交 了"
#ie.buttonClick("Submit") 用来取代鼠标点击 方便多了

#源代码里是 input type="submit" name="Submit" 所以 第一个参数就是name的值"Submit"
#pamie是共分 大小写的

#ie.buttonClick("Submit")

#IE有自已的特性, 好像用 pamie 打开多个网页,都是加在同一个IE进程里的,不是一个网页一个进程

'''很多网页较复杂,有图片按钮, javaScript按钮 等的... 若是 图片类按钮
用 ie.buttonImageClick("submitRegister")

有些按钮是 鼠标点击后 会执行一个 javascript 来提交内容的 如源代码里内容是:
<input type="image" src="http://www.sit.com/member/images/register.gif " width="100" height="54" border="0"
onClick="javascript:submitMe();
就是说 点击 那个 叫做 register.gif的图片会 会执行 javascript:submitMe() 来提交页面...时 可用:

ie.javaScriptExecute("javascript:submitMe()")   来自动提交页面. 这类按钮 鼠标移上去后,IE左下角一般会出现 相应的

javascript:theFunction() 很容易找...

执行 带参数的 javascript function 也是可以的... ie.javaScriptExecute("javascript:submitMe('param')")
也可直接设置一个 网页里元素的值:
例如 网页源文件里 设置了 document.Form.id.value="string" 可用下面语句直接更改

ie.javaScriptExecute("javascript:document.Form.id.value='theValueYouWant'")


另外: pamie2.0 里有个 模块用来处理 简单的 弹出窗口 这类窗口的标题一般为: Microsoft Internet Explorer

import cModalPopUp

a=cModalPopUp.handlePopup('Confirm',"确定") #"第二个参数是 "确定",表示 弹出窗口的按钮上的 文字是 "确定"这二个字

如图:

 
执行:

a.run() 就可用程序来点击那个"弹出窗口"的"确定"按钮了...
可用多线程程序用一个线程来处理这类窗口就不妨碍主程序了...

另外 一个对 pamie 很有用的 填表类工具 : AiRoboForm.exe

 
安装好这个IE工具栏工具后,就可按一下"保存"如上图的"Save"按钮 保存网页表格,然后 鼠标移到 如上图 "Baidu"处停一点时间就出弹出一个子菜单 选择 "edit" 就可看到 那个页面的 表单的 所有名字了 就不用在 源代码里辛苦的找那么多的 "第一个参数" 也就是说 不用自已找 文本框和列表框名称等了, 你可在那个打开了的 编缉器里看到所有的 要填的框的 "名字"了的只是显示的全是"小写"了, 需要在源文件里看一下第一个字母是否是大写等...pamie是 区分大小写的 AiRoboForm是不区分大小写的...

pamie2.0也有不足的地方:

下文是一个引自 http://yinxl.spaces.live.com/blog/cns!4626e4f8c0bfc0bc!172.entry 的 "扩展补丁".

5月14日
让PAMIE能轻松控制一个新开的IE窗口
      这段时间在写一个WEB的测试程序,根据ZV的推荐,采用了Python实现,因为有个PAMIE的开源包在测试WEB页面时非常好用。但是在使用 PAMIE时发现它的findWindow函数非常难用,导致测试程序很难控制新开的IE窗口,例如HTML:<a href="b.html" target="_blank">link_content</a>,这种链接打开的新IE窗口。
      通过阅读PAMIE的源码也找不到合适的解决办法,只有自己动手啦。我参考了IEC的开源包的方法,自己修改了PAMIE的cPAMIE.py的 PAMIE类的构造函数,修改后的构造函数根据输入的URL地址可以找到当前已经找到的IE窗口,如果没有发现匹配的窗口,那么PAMIE会新建一个窗口打开该URL。
     下面是修改后的代码:
     from win32com.client import Dispatch   #需求增加的import语句 
     # 2006-5-10 Modified by YinXianglong to find a opened IE Window. BEGIN
    def __init__(self, url=None, isFind=False, timeOut=300):
        """ The class instantiation code. When the object is instantiated you can
        pass a starting URL. If no URL is passed then about:blank, a blank
        page, is brought up.
        parameters:
            [url]     - url to navigate to initially
            [isFind] - if isFind = True, find a opened IE Window whose LocationURL is equal to url
            [timeOut] - how many 100mS increments to wait, 10 = 1sec, 100=10sec
        returns:
            Nothing
        """       
        
        self.showDebugging = True           # Show debug print lines?
        self.colorHighlight = "#F6F7AD"     # Set to None to turn off highlighting
        self.frameName = None               # The current frame name or index. Nested frames are
                                            # supported in the format frame1.frame2.frame3
        self.formName = None                # The current form name or index
        self.busyTuner = 1                  # Number of consecutive checks to verify document is no longer busy. 
        find_ok_flag = False
        if isFind and (url != ''):
           clsid='{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'# CLSID for ShellWindows
           ShellWindows = Dispatch(clsid)
           url = url.lower()
           for i in range(ShellWindows.Count):
              if ShellWindows[i].LocationURL.lower().find(url) > -1:
                 self._ie = ShellWindows[i]
                 find_ok_flag = True
        if not find_ok_flag: 
           print "Can't Find the opened IE Window whose LocationURL is equal to url." 
           self._ie = DispatchEx('InternetExplorer.Application')
           if url:
               self._ie.Navigate(url)
           else:
               self._ie.Navigate('about:blank')
          
        self._timeOut = timeOut
        self._ie.Visible = 1
        self.timer = datetime.datetime.now()   
        # 2006-5-10 Modified by YinXianglong to find a opened IE Window. END 
        其他代码同PAMIE2.0的代码相同。   
       下面是测试代码:
        import yxlPAMIE 
        ie = yxlPAMIE.PAMIE(" http://172.17.153.171/NewSys/default.aspx ") 
        print ie.pageGetText() 
       
        测试结果是显示了已经打开的http://172.17.153.171/NewSys/default.aspx 窗口的HTML代码。
附录:网易注册程序代码

#coding:gbk
import cPAMIE
import time
import random
username = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz0123456789',8))
password = '******'
zhanghao = '|'.join([username,password])
ie= cPAMIE.PAMIE()

#打开目标网页

ie.navigate ('http://reg.163.com/reg0.shtml')

#注意下面所列的 第一个参数如 fistname 等 都是 网页源代码里的 input name="firstname"
#里找出来的,不能用 网页上看见的黑体字: "First Name:"
#填文本框
ie.textBoxSet('username',username)

ie.textBoxSet('password','*****')
ie.textBoxSet('cpassword','*****')

#先择下拉菜单:

ie.listBoxSelect('question',unicode('我的自定义问题', 'cp936'))#注意此处编码转换 cp936 可以换成GBK
ie.textBoxSet('myQuestion','wodewentishishenme')
ie.textBoxSet('answer','wodoubuxihuan')
ie.textBoxSet('year','1986')
ie.listBoxSelect('month','6')
ie.listBoxSelect('day','22')
#方形选择框:

#ie.checkBoxSet('cxbx',1) #1 2 3 或 * 号等都是 "勾选"的意思 '' 空字符串代表取消选择

#圆形选择框: 英语是 radio 做过网页设计就容易知道这些元素的命名了
#这里选择 Jazz
ie.radioButtonSet("gender","1") # music是这个 选择列表的名字,从网页源代码里找出


#最后提交按钮

print "请输入验证码 然后提交"
#ie.buttonClick("Submit") #用来取代鼠标点击 方便多了

i = 0
while i<100:
    pass
    i = i+1
    if True == ie.findText(unicode('恭喜', 'gbk')):
       break

fp = open('163zhanghao.txt','a')
fp.write(zhanghao+'\n')
fp.close()
ie.quit()

循环注册

#coding:gbk
import cPAMIE
import time
import random
username = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz0123456789',8))
password = 'wokao1'
zhanghao = '|'.join([username,password])
i = 0
while i<1000:
    ie= cPAMIE.PAMIE()
    ie.navigate ('https://passport.baidu.com/?reg')
    ie.textBoxSet('username',username)
    ie.textBoxSet('loginpass','*****')
    ie.textBoxSet('verifypass','*****')
    ie.radioButtonSet("sex","1") 
    ie.textBoxSet("email",username+'@msn.cn')
    i = 0
    while i<1000:
       pass
       i = i+1
       if True == ie.findText(unicode('恭喜', 'gbk')):
          break
    fp = open('163zhanghao.txt','a')
    fp.write(zhanghao+'\n')
    fp.close()
    ie.quit()
    i = i+1

 

Python这种脚本语言的强大功能越来越被广大的程序员所重视,这种之前在国内流行度不高的语言近来气势高涨。各种第三方模块层出不穷。
 
本文介绍的便是一种能非常方便操作IE的第三方工具,PAMIE,他能让你如同写JS一样来操作IE浏览器。包括自动启动,访问链接,设置文本框值,获取按钮,执行点击事件,甚至执行页面JS方法等等。下面用一个实际的例子详加说明:
 
以下简短代码便轻易实现,登录本人ChinaUnix,并以此点击日志文章,发文章,设置标题,分类,和博客内容,最后执行确定,发布成功。
 
 

-*- coding: gb2312 -*-
from PAM30 import PAMIE
from string import split
#===============================================================================
# 从文件读取配置信息,登录url,账户,密码等
#===============================================================================
def getCfgFromFile(fileName='settings.txt'):
    file = open(fileName)
    dict = {}
    line = file.readline()
    while line != '':
        args = split(line, '=')
        dict[args[0]] = args[1].decode('utf-8').encode('gb2312')
        line = file.readline()
    return dict
dict = getCfgFromFile()
ie = PAMIE()
#===============================================================================
# 打开登录页面,设置用户/密码
#===============================================================================
ie.navigate(dict['login-url'])
ie.setTextBox('username', dict['username'])
ie.setTextBox('password', dict['password'])
#===============================================================================
# 获取登录按钮
#===============================================================================
loginbtn = ie.findElement('input', 'type', 'image')
ie.clickElement(loginbtn)
#===============================================================================
# 点击文章管理
#===============================================================================
ie.navigate(dict["article-url"])
#===============================================================================
# 点击写文章
#===============================================================================
mainFrame = ie.getFrame('main')
pwindow = mainFrame.document.parentWindow
pwindow.execScript('NewArticle()')
#===============================================================================
# 设置文章标题,文章分类,系统分类,文章类型
#===============================================================================
mainFrame = ie.getFrame('main')
doc = mainFrame.document
#------------------------------------------------------------------------ 设置文章标题
doc.getElementById('blog_title').value = dict['title']
#------------------------------------------------------------------------ 文章分类-java
doc.getElementById('frmid').value = '119124'
#------------------------------------------------------------------------ 系统分类-java
doc.getElementById('systemfrmid').value = '20'
#----------------------------------------------------------------------- 文章类型-原创
doc.getElementById('arttype').value = dict['arttype']
#===============================================================================
# 填写文章内容
#===============================================================================
pwindow = mainFrame.document.parentWindow
pwindow.execScript('InsertHTML("Python+PAMIE")')
pwindow.execScript('InsertHTML("如此强大的功能")')
#===============================================================================
# 发表文章
#===============================================================================
pwindow.execScript('savearticle()')