升级 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、pip

easy_install 的增强版,需要自行下载安装:

https://pypi.python.org/pypi/pip#downloads

使用方法如:

pip install MySQL-python
pip install xlrd
pip install xlwt

如果有错误,可能是缺少python头文件,yum install python-devel 即可。

基本语法:

零散:

a**b    ==  pow(a,b)

raw_input   &&  input

str && 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,这个要注意,因为无法为 -0

2、分片:[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 函数可以把其它序列转换成 tuple

4、元组的操作很简单,一般只有创建元组和访问元组元素。

5、有了列表,为什么还要引入元组:一是元组可以在映射(和集合的成员)中当作键使用——而列表不行。二是元组作为很多内建函数和方法的返回值存在。

字符串操作:

1、字符串是不可变的,所以类似于分片赋值是不可行的。

2、字符串格式化:

#格式化操作符右操作数可以是任何东西,如字符串变量,元组或字典等
print "user'name is %s" %"tianya"
print "username:%s password:%s" %("tianya","")
mydict = {"username":"tianya","password":""}
print "username:%(username)s password:%(password)s" %mydict

如果格式化字符串里包括百分号,则必须使用 %% ,否则会被认为是转换说明符。

3、模板字符串:

from string import Template

s = Template("hello $x")
print s.substitute(x="world")
s = Template("username:${username}&&password:${password}")
mydict = {"username":"tianya","password":""}
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,3

print x,y,z

mytuple = (1,2)

x,y = mytuple

mydit = {"name":"tianya"}

key,value = mydict.popitem()

False,None,0,"",(),[],{}  都被认为是假,即标准的 False,None,0 和空序列,空字典

bool函数可以取表达式的布尔值

0<x<100

短路逻辑 a if b else c

assert x>0,"a not > 0"

能用 for 的地方就不要用 while

range 与 xrange

迭代工具

循环中的 else 可以测试是否是 break 跳出的

列表推导式

exec 与 eval 分别表示执行和求值字符串

 位置参数与关键字参数:

def fun(x,y,z=3, *pospar, **keypar):
print x,y,z
print pospar
print keypar fun(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 = name def __del__(self):
print "__del__()" def say(self):
print self.name p = Person()
p.say()
p2 = Person("lisi")
p2.say()
del p

特殊方法:

class User:
def __init__(self,name = "tianya"):
self.name = name def __del__(self):
del self.name def __len__(self):
return len(self.name) def __getitem__(self,key):
return eval("self."+key) def __str__(self):
return "user.name:"+self.name def __lt__(self,other):
return self.name < other.name user = User()
print len(user)
print user["name"]
print user user2 = User("feng")
if user > user2:
print user.name + ">" + user2.name
else:
print user.name + "<" + user2.name del user,user2

构造函数与析构函数:

def __init__( self ):
pass def __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:
break
print line
f.close() import cPickle
f = file("test002.txt","w")
cPickle.dump(mylist,f)
f.close()
del mylist
f = file("test002.txt")
newlist = cPickle.load(f)
print newlist

python 打包工具:

常用的PYTHON打包工具有:py2exe、pyInstaller、cx-freeze,目前只有 cx-freeze 支持 python3.x

http://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 build
python setup.py install

4、示例代码如下:

import time
import MySQLdb try:
conn=MySQLdb.connect(host='211.152.53.103',user='root',passwd='',port=)
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():
value=[i,'test:'+str(i)]
cur.execute('insert into test values(%s,%s)',value)
conn.commit()
time.sleep() sql ="select * from test";
cur.execute(sql)
data = cur.fetchall()
if data:
for row in data:
print row[],row[]
cur.close()
conn.close() except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[], e.args[])

解析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 xlrd
import sys
from tkinter import *
from tkinter import filedialog def 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.nrows
col_count = table.ncols #有效行数,判断依据:如果第一列向下有一个单元格内容为空,则视为结束
valid_row_count = 0
for item in table.col_values(0):
if item:
valid_row_count = valid_row_count+1
else:
break #有效列数,判断依据:标题行如果有一个单元格内容为空,则视为结束
valid_col_count = 0
for item in table.row_values(0):
if item.strip():
valid_col_count = valid_col_count+1
else:
break #print(row_count)
#print(valid_row_count)
#print(col_count)
#print(valid_col_count) rows = table.nrows cols = 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 lua
for 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 xlrd
import logging
import MySQLdb
import json data = xlrd.open_workbook("data.xls")
sheet_name = data.sheet_names()[0]
table = data.sheet_by_name("sql")
row_count = table.nrows
col_count = table.ncols
logging.warning(row_count)
logging.warning(col_count) i = 0
conn=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+1
logging.warning(i)
row = table.row_values(rowindex)
mydict = dict()
if str(row[1]) == '':
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 = 3
print h.user.id

python 网络操作:

#!/usr/bin/python
import socket
import struct
import binascii
import json def send(protocol, msg):
ip = '127.0.0.1'
port = ''
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 += block
sock.close()
return response

python 操作 plist :

https://github.com/wooster/biplist

pexpect 模块

是一个用来启动子程序并对其进行自动控制的纯 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-8
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage mailto_list=['123456789@qq.com']
mail_host="smtp.163.com" #设置服务器
mail_user="123456789@163.com" #用户名
mail_pass="" #口令
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'] = sub
msg['From'] = me
msg['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 True
except Exception, e:
print str(e)
print 'error'
return False if __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>")

PYTHON学习总结的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  3. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  4. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  5. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  6. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  7. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  8. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

  9. Python学习之路【目录】

    本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! 目录: Python学习[第一篇]python简介 Python学习[第二篇]p ...

  10. python学习笔记系列----(八)python常用的标准库

    终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...

随机推荐

  1. BZOJ4720 [Noip2016]换教室

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  2. 你知道QQ有多少人同时在线么

    偶尔发现一个有意思的网站, QQ用户量这么大,那么到底有多少小伙伴同时在线呢? 以下是QQ官方的统计地址: http://im.qq.com/online/index.shtml QQ游戏玩家同时在线 ...

  3. CMD.EXE中dir超长字符串缓冲区溢出原理学习

    最近看逍遥的<网络渗透攻击与安防修炼>讲到CMD命令窗口的dir传超长字符串溢出的例子.自己实验了一下,的确会产生程序崩溃,但是具体什么原理没太详细说,这里做一下原理探究,权当学习笔记了. ...

  4. web开发 虚拟目录映射

    A 当服务器和 web应用不在一个目录下 $CATALINA_BASE/conf/catalina/localhost/ 文件夹下创建一个xml文件,任意文件名都可以,但是此文件名是web应用发布后的 ...

  5. 【Alpha版本】 第十天 11.18

    一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 完成管理员的三大功能界面框架, 我要招聘查看报名者的列表显示 完成 ...

  6. Servlet3.0中Servlet的使用

    目录 1.注解配置 2.异步调用 3.文件上传 相对于之前的版本,Servlet3.0中的Servlet有以下改进: l  支持注解配置. l  支持异步调用. l  直接有对文件上传的支持. 在这篇 ...

  7. python 安装包总结

    PIL安装(Centos6.6) 1. 安装PIL所需的系统库 (centos6.6)yum install zlib zlib-devel -yyum install libjpeg libjpeg ...

  8. HTTP常见错误编号

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...

  9. .Net中使用OracleDataAdapter

    本来只想简单记录一下OracleDataAdapter的批量增加和修改用法的,在园子里看到一篇比较详细的就在这分享了(Oracle Data Provider for .NET),虽然用的是 Upda ...

  10. Windows 无法自动将 IP 协议堆栈绑定到网络适配器。解

    Windows 无法自动将 IP 协议堆栈绑定到网络适配器.解  昨天断网了,所以把珍藏已久的无线网卡拿出来蹭网.我系统是Windows 7 但是装上去东显示已启用,就是用不了,用windows诊断是 ...