您的位置:首页 > 编程语言 > Python开发

PYTHON学习总结

2013-07-12 10:15 309 查看
升级 python 版本的问题升级 python 一般会建立软连接,使系统默认的python指向高版本的 python,如:
mv
/usr/bin/python /usr/bin/python2.6.6
ln
-s /usr/
local
/bin/python2.7 /usr/bin/python
但由于 yum 命令是基于原版本的 python 来执行的,为解决修改软链接后,yum 不能正常工作的问题(可能版本不兼容,尤其是3.X):编辑
/usr/bin/yum
:#!/usr/bin/python => #!/usr/bin/python2.6.6 即可IDE:不建议直接使用 IDLE 写代码,如果出现 TAB 和 SPACE 混用很难排查,可以使用 sublime_text 编写代码,ctrl + a 全选后,TAB 键为实线,空格为虚线标识。建议直接使用 PyCharm ,windows、linux、mac 版本都有。还有 ulipad 也不错。另外推荐 Eclipse + PyDev 的组合,也很不错。这三款IDE都可跨平台。编码问题:在使用 python2.x 时,将字符串写入文件时报错:UnicodeEncodeError: 'ascii' codec can't encode character u'\uff1a',即ascii码无法被转换成unicode码(在读取MYSQL数据库中的中文数据时,也可能出现此问题)。如果使用 python3.x ,则无此编码问题。默认 python2.x 的编码是 ascii ,可以使用 print sys.getdefaultencoding() 查看,修改方法有两种:1、在代码中加入:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
2、在安装目录的 Lib\site-packages\ 目录下新建 sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
在 python 文件中有中文的话(即使是注释),则需要在文件头加上如下代码,否则会运行出错:
#coding:utf-8
3、有时候会遇到中文输出时变成类似于 “\u5929\u6d25\u5546\u573a” 情况,此时只要把它转换成 unicode 对应的字符就可以了。如: mystr = "\u5929\u6d25\u5546\u573a"newstr = mystr.decode("unicode-escape")
  模块安装工具:1、easy_install一般随 python 自带。2、pipeasy_install 的增强版,需要自行下载安装:https://pypi.python.org/pypi/pip#downloads使用方法如:
pip install MySQL-pythonpip install xlrdpip install xlwt
如果有错误,可能是缺少python头文件,yum install python-devel 即可。基本语法:零散:a**b == pow(a,b)raw_input && inputstr && repr && ``obj == eval(repr(obj))eval(repr(type(type))) #error# 尽管str()和repr()运算在特性和功能方面都非常相似,事实上repr返回的是一个对象的“官方”字符串表示,也就是说绝大多数情况下可以通过求 值运算(使用内建函数eval())重新得到该对象,但str()则有所不同。str()致力于生成一个对象的可读性好的字符串表示,它的返回结果通常无 法用于eval()求值,但很适合用于print语句输出。需要再次提醒的是,并不是所有repr()返回的字符串都能够用 eval()内建函数得到原来的对象。也就是说 repr() 输出对 Python比较友好,而str()的输出对用户比较友好。虽然如此,很多情况下这三者的输出仍然都是完全一样的。r"C:\Program Files\fnord""\\" == "C:\\Program Files\\fnord\\"u"Hello,World!" #python3.0中,所有字符串都是 Unicode 字符串。python内建有6种序列:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象。元组不可修改,在几乎所有情况下列表都可以替换元组。(例外如,使用元组作为字典的键,因为键不可修改)os.system("ls") linux下可用来调用 shell 命令通用序列操作:1、索引访问:从0开始,并支持负数索引,表示从右边开始,最后1个元素的位置编号是 -1,这个要注意,因为无法为 -02、分片:[i:j],包括 i 索引,不包括 j 索引。 [-3:] 最后三个元素。 [:3] 前三个元素。 [:] 所有元素。 通用版本: [i : j: step] 之前的版本 step==1,若 step>0 表示从左到右提取元素(即 j >= i),反之则从右到左提取(即 j<=i)。切片需要大量练习以达到熟练。3、序列相加:直接可以使用 + 符号连接两个序列。4、序列相乘:使用数字 n 乘以一个序列会生成一个新序列,原来的序列会被重复 n 次。如:[0]*10 && [None]*10 :初始化10个空元素的列表。  5、判断元素是否存在:in 运算符,返回值为 True 或 False。如 ("s" in "string") == True,从 python2.3 开始,支持子字符串判断,如:("st" in "string") == True,但是这只是字符串序列的特例。6、长度(len),最大值(max),最小值(min):如 len([1,2,3])列表操作:1、list 函数可以把所有序列转换成 list。可以通过 "".join(somelist) 来把字符组成的列表转换为字符串。2、删除元素: del lt[0] ,del 还可以删除某个变量。3、分片赋值,这个比较强大,可以使用与原序列不等长的序列将分片替换,也可以实现在任意一个位置直接插入一段新序列,同样的可以实现删除元素(分片替换为空序列,效果等同于 del lt[1:4]),更复杂的是加上步长,甚至是负数步长的分片赋值操作。4、常用成员方法:append(element), count(element), entend(list2), index(element), insert(index,element), pop(index = last), remove(element), reverse(), sort(cmp=None, key=None, reverse=False)元组操作:1、当使用逗号分隔了一些值 ,就自动创建了元组。2、一个元素的元组,必须加个逗号: (1,),否则 (1) == 1。3、tuple 函数可以把其它序列转换成 tuple4、元组的操作很简单,一般只有创建元组和访问元组元素。5、有了列表,为什么还要引入元组:一是元组可以在映射(和集合的成员)中当作键使用——而列表不行。二是元组作为很多内建函数和方法的返回值存在。字符串操作:1、字符串是不可变的,所以类似于分片赋值是不可行的。2、字符串格式化:
#格式化操作符右操作数可以是任何东西,如字符串变量,元组或字典等print "user'name is %s" %"tianya"print "username:%s password:%s" %("tianya","123456")mydict = {"username":"tianya","password":"123456"}print "username:%(username)s password:%(password)s" %mydict
如果格式化字符串里包括百分号,则必须使用 %% ,否则会被认为是转换说明符。3、模板字符串:
from string import Templates = Template("hello $x")print s.substitute(x="world")s = Template("username:${username}&&password:${password}")mydict = {"username":"tianya","password":"123456"}print s.substitute(mydict)
同样的,如果字符串里包括 $,则以 $$ 表示。4、常用方法:非常多,请通过 help(str) 查看。字典操作:1、dict 函数可以把其他映射或序列对建立成字典,如: lt = [("tianya","zhenmu"),("123","456")]; dict(lt) , dict(name="tianya",password="123456")2、常用方法:clear(), copy(), deepcopy(dict), fromkeys(sequence,value=None), get(key), has_key(key), keys(), iterkeys(), items(), iteritems(), pop(key), popitem(item=last), values(), itervalues()语句:x,y,z = 1,2,3print x,y,zmytuple = (1,2)x,y = mytuplemydit = {"name":"tianya"}key,value = mydict.popitem()False,None,0,"",(),[],{} 都被认为是假,即标准的 False,None,0 和空序列,空字典bool函数可以取表达式的布尔值0<x<100短路逻辑 a if b else cassert x>0,"a not > 0"能用 for 的地方就不要用 whilerange 与 xrange迭代工具循环中的 else 可以测试是否是 break 跳出的列表推导式exec 与 eval 分别表示执行和求值字符串 位置参数与关键字参数:
def fun(x,y,z=3, *pospar, **keypar):print x,y,zprint posparprint keyparfun(1,2,3,4,5,key1=10,key2=20)输出:1 2 3(4, 5){'key2': 20, 'key1': 10}fun(1,2)输出:1 2 3(){}
python 没有重载,也没有重载构造函数: __del__ 类似于析构函数,但无法确定什么时候会被调用,除非你使用 __del__ 显式删除对象。
class Person:def __init__(self,name = "zhangsan"):self.name = namedef __del__(self):print "__del__()"def say(self):print self.namep = Person()p.say()p2 = Person("lisi")p2.say()del p
特殊方法:
class User:def __init__(self,name = "tianya"):self.name = namedef __del__(self):del self.namedef __len__(self):return len(self.name)def __getitem__(self,key):return eval("self."+key)def __str__(self):return "user.name:"+self.namedef __lt__(self,other):return self.name < other.nameuser = User()print len(user)print user["name"]print useruser2 = User("feng")if user > user2:print user.name + ">" + user2.nameelse:print user.name + "<" + user2.namedel user,user2
构造函数与析构函数:
def __init__( self ):passdef __del__( self ):pass
IO 操作和持久化对象存储:
f = file("test.txt","w")mylist = [1,2,3,4]f.write(repr(mylist))f.close()f = file("test.txt")while True:line = f.readline()if len(line) == 0:breakprint linef.close()import cPicklef = file("test002.txt","w")cPickle.dump(mylist,f)f.close()del mylistf = file("test002.txt")newlist = cPickle.load(f)print newlist
python 打包工具:常用的PYTHON打包工具有:py2exe、pyInstaller、cx-freeze,目前只有 cx-freeze 支持 python3.xhttp://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/http://www.pyinstaller.org/http://sourceforge.jp/projects/sfnet_cx-freeze/releases/常用的UI库有:Tkinter、wxPython、PyQt,这三个都是平台无关的,但如果使用 PyQt 为商业目的,则需要付费,否则遵循 GPL 协议。另外还有 PtGTK(Linux)、pywin32(windows)。其中,Tkinter 是标准库自带的,在 python2.x 中叫 Tkinter,在 python3.x 中叫 tkinter,推荐使用,虽然界面相对不漂亮。操作 MYSQL 数据库的库有:目前只用过 MySQLdb,感觉非常好用。安装过程如下:1、安装 Python 头文件:(如果手动使用源码升级过 python,这里直接把升级包中的 python 源码放进 /usr/local/include,不过一般已经在源码升级时自动做好了)
yum install python-devel  
否则会报异常:fatal error: Python.h: 没有那个文件或目录2、安装 mysql_config
apt-get install libmysqlclient-dev
3、MySQLdb下载地址:http://sourceforge.net/projects/mysql-python/
python setup.py buildpython setup.py install
4、示例代码如下:
import timeimport MySQLdbtry:conn=MySQLdb.connect(host='211.152.53.103',user='root',passwd='123456',port=3306)cur=conn.cursor()cur.execute('drop database if exists python')cur.execute('create database if not exists python')conn.select_db('python')cur.execute('create table test(id int,info varchar(20))')for i in range(100):value=[i,'test:'+str(i)]cur.execute('insert into test values(%s,%s)',value)conn.commit()time.sleep(0)sql ="select * from test";cur.execute(sql)data = cur.fetchall()if data:for row in data:print row[0],row[1]cur.close()conn.close()except MySQLdb.Error,e:print "Mysql Error %d: %s" % (e.args[0], e.args[1])
解析EXCEL的库有:有 xlrd(支持 python 3.x,最新版本支持 .xlsx 格式)、xlwt(只支持 python2.x,.xls格式)。安装 xlrd: python setup.py install在 Excel 中插入图片:http://www.cnblogs.com/snake-hand/p/3153158.html代码如下:
import xlrdimport sysfrom tkinter import *from tkinter import filedialogdef openexcel():filename = filedialog.askopenfilename(initialdir = 'c:/')if filename:data = xlrd.open_workbook(filename)#获取sheet名称,留为生成lua表的主键sheet_name = data.sheet_names()[0]table = data.sheet_by_name(sheet_name)#总行数和总列数row_count = table.nrowscol_count = table.ncols#有效行数,判断依据:如果第一列向下有一个单元格内容为空,则视为结束valid_row_count = 0for item in table.col_values(0):if item:valid_row_count = valid_row_count+1else:break#有效列数,判断依据:标题行如果有一个单元格内容为空,则视为结束valid_col_count = 0for item in table.row_values(0):if item.strip():valid_col_count = valid_col_count+1else:break#print(row_count)#print(valid_row_count)#print(col_count)#print(valid_col_count)rows = table.nrowscols = table.ncols#get title_row:title_row = table.row_values(0)valid_title_list = []for colindex in range(valid_col_count):if title_row[colindex].find("(") > 0:valid_title_list.append(title_row[colindex][0:title_row[colindex].find('(')])else:valid_title_list.append(title_row[colindex])#print(valid_title_list)lua = sheet_name + "=\n"luadata = "{\n"#get data to luafor rowindex in range(1,valid_row_count):row = table.row_values(rowindex)if row:luarow = "{"for colindex in range(0,valid_col_count):if isinstance(row[colindex],str):luarow = luarow + valid_title_list[colindex] + " = \"" + row[colindex].replace("\n"," ") +"\","else:luarow = luarow + valid_title_list[colindex] + " = " + str(row[colindex]).replace("\n"," ") +","luadata = luadata + "\t" + str(luarow) + "},\n"lua = lua + luadata + "}"print(lua)f = open(sheet_name + ".lua","w")f.write(lua)f.close()root = Tk()b1 = Button(root,text='open file',width=30,height=5,command=openexcel)b1.pack()root.mainloop()
综合EXCEL和MYSQL的例子:
import xlrdimport loggingimport MySQLdbimport jsondata = xlrd.open_workbook("data.xls")sheet_name = data.sheet_names()[0]table = data.sheet_by_name("sql")row_count = table.nrowscol_count = table.ncolslogging.warning(row_count)logging.warning(col_count)i = 0conn=MySQLdb.connect(host='100.112.113.114',user='test',passwd='1u12Z2Sfhs2',port=3306)cur=conn.cursor()conn.select_db('gamedb_901001')for rowindex in range(1,row_count):i = i+1logging.warning(i)row = table.row_values(rowindex)mydict = dict()if str(row[1]) == '96':mydict['platformStr'] = "PLATFORM_TYEP_ERATING"else:mydict['platformStr'] = "PLATFORM_TYEP_91"mydict['eRoleID'] = int(row[5])mydict['eratingID'] = int(row[3])mydict['name'] = str(row[2])userid = int(row[7])sql = "update p_user set oneEratingUserData='%s' where id = %s" %(json.dumps(mydict),userid)cur.execute(sql)cur.close()conn.close()
调用 C 的动态库或静态库:
from ctypes import *msvcrt=CDLL('msvcrt.dll')    #msvcrt =cdll.msvcrt            #以cdll的方式加载msvcrt  或者写作: msvcrt =cdll.LoadLibrary("msvcrt.dll")msvcrt.printf('a=%d,b=%d,a+b=%d',1,2,1+2)windll.user32.MessageBoxA(0, "great", 'hello world', 0)
调用自定义动态库:
//User.cpp:class User{public:int id;int age;};extern "C"{User user;int id = user.id;}gcc User.cpp -o libUser.so -shared -fPIC//test.py:from ctypes import *h = CDLL('./libUser.so')h.user.id = 3print h.user.id
python 网络操作:
#!/usr/bin/pythonimport socketimport structimport binasciiimport jsondef send(protocol, msg):ip = '127.0.0.1'port = '2014'sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:sock.connect((ip,int(port)))except Exception:return "%s:%s connect error!" %(ip,port)buffer = struct.pack("IIII",protocol,len(json.dumps(msg)),binascii.crc32(json.dumps(msg)),1)sock.send(buffer)sock.send(json.dumps(msg))head = sock.recv(16)msg_body_size = struct.unpack("IIII",head)[1]response = str()block = str()while len(response)<msg_body_size:block = sock.recv(1024)response += blocksock.close()return response
python 操作 plist :https://github.com/wooster/biplistpexpect 模块是一个用来启动子程序并对其进行自动控制的纯 Python 模块python 调用 shell 命令:os.system(cmd)   不能获取执行后返回的信息os.popen(cmd)    不但执行命令还返回执行后的信息对象commands 模块commands.getoutput('cmd')  返回执行shell命令的标准和错误输出commands.getstatusoutput('cmd')  返回长度为2的元组,第一个元素是执行结果状态码(int),第二个元素是标准和错误输出。即 tuple(status, output)subprocess 模块status = subprocess.call('./client 127.0.0.1 2014')   调用进程
wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py &&  #或:easy_install pip &&python get-pip.py &&pip install simplejson &&pip install pexpect
模拟输入,自动化登录:
cmd2 = pexpect.spawn('scp GamePlist.zip %s@%s:/usr/local/apache2/htdocs/sailing/protocol/GamePlist.zip' %(username,host))cmd2.expect('password:',timeout=5)logging.warning(cmd2)cmd2.sendline(password)cmd2.sendline('\r')
python 的邮件操作:
#!/usr/bin/python#coding:utf-8import smtplibfrom email.MIMEMultipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagemailto_list=['123456789@qq.com']mail_host="smtp.163.com"  #设置服务器mail_user="123456789@163.com"   #用户名mail_pass="123456"   #口令mail_name = "发件人名称(随便写)"mail_postfix="163.com"  #发件箱的后缀def send_mail(to_list,sub,content):me= mail_name+"<"+mail_user+"@"+mail_postfix+">"msg = MIMEMultipart('related')msg['Subject'] = submsg['From'] = memsg['To'] = ";".join(to_list)content = MIMEText(content,_subtype='html',_charset='gb2312')msg.attach(content)image = MIMEImage(open('test2.jpg','rb').read())image.add_header('Content-ID', '<image1>')msg.attach(image)attach_file = MIMEText(open('Resource.rar').read(),'base64','gb2312')attach_file["Content-Type"] = 'application/octet-stream'attach_file["Content-Disposition"] = 'attachment; filename="Resource.rar"'msg.attach(attach_file)try:server = smtplib.SMTP()server.connect(mail_host)server.login(mail_user,mail_pass)server.sendmail(me, to_list,msg.as_string())server.close()return Trueexcept Exception, e:print str(e)print 'error'return Falseif __name__ == '__main__':#send_mail(mailto_list,u"测试邮件标题",u"<b><font color='red'>测试邮件正文。</font></b>")send_mail(mailto_list,u"测试邮件标题333",u"<font color='red'>这是红色的邮件正文。</font><br /><br />下面是一张图片:<br /><img src='cid:image1'>...")#send_mail(mailto_list,u"测试邮件标题",u"<font color='red'>测试邮件正文。</font>")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: