PYTHON學習總結


升級 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","123456")
mydict = {"username":"tianya","password":"123456"}
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":"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,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='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 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]) == '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 = 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 = '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 += 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="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'] = 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>")

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM