1. 程式人生 > >python中一些實用而有趣的模組

python中一些實用而有趣的模組



以下為日常總結的Python中實用的模組和函式,放在這裡當做記錄,也希望能幫到其他人微笑

#cv2模組為opencv

img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)# 讀入圖片,灰階化
img=cv2.imread('1.jpg')# 讀入圖片

import os
flist=os.listdir('test')
def showvar(flist):
     for f in flist:
             img=cv2.imread(f,cv2.IMREAD_GRAYSCALE)   //可以使用某個通道,一般用灰度值
             print f+'    '+str(cv2.Laplacian(img,cv2.CV_64F).var())  //用拉普拉斯運算元計算影象清晰度,值越大越清晰 var為方差
showvar(test)

def show(img):
   cv2.imshow('d',img)
   cv2.waitKey(0)    #習慣使用的顯示圖片函式

x,y,color=img.shape#獲得圖片大小

img2=cv2.resize(img,(300,300))#改變圖片大小

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))  #定義結構元素,影象膨脹、侵蝕、開閉運算用

eroded = cv2.erode(img,kernel)#腐蝕影象 

dilated = cv2.dilate(img,kernel)#膨脹影象

opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)#開運算  morphology:形態學
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)#閉運算
show(cv2.absdiff(opened,closed))#兩個影象的差->邊緣
#閉運算用來連線被誤分為許多小塊的物件,而開運算用於移除由影象噪音形成的斑點。因此,某些情況下可以連續運用
#這兩種運算。如對一副二值圖連續使用閉運算和開運算,將獲得影象中
#的主要物件。同樣,如果想消除影象中的噪聲(即影象中的“小點”),也可以對影象先用開運算後用閉運算,不過這樣也會消除一些破碎的物件。

retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY)#二值化,40為閾值

cap=cv2.VideoCapture(0)#獲得照相裝置的控制代碼,一般0是攝像頭
flag,img=cap.read()#從該裝置處獲得影象

result = cv2.bitwise_not(result)#反色

#檔案與資料夾內容的比較 filecmp模組
>>> filecmp.cmp('D:\\sushu.txt','D:\\sushu2.txt')
False
>>> filecmp.dircmp('D:\\test1','D:\\test2')
<filecmp.dircmp instance at 0x01D6AF30>
>>> x=filecmp.dircmp('D:\\test1','D:\\test2')
>>> x.report()  #x還有各種屬性,可以通過訪問他們方便地得到下面所有的資料
diff D:\test1 D:\test2
Only in D:\test2 : ['333.txt']
Identical files : ['11.txt', '11.txt.bak']
Differing files : ['22.txt', '22.txt.bak']


#對字串內容的比較  difflib模組
>>> import difflib
>>> str1='abbbcd'
>>> str2='abcd'
>>> k=difflib.SequenceMatcher(None,str1,str2)
>>> k.get_matching_blocks()
[Match(a=0, b=0, size=1), Match(a=3, b=1, size=3), Match(a=6, b=4, size=0)]
>>> k.get_opcodes()
[('equal', 0, 1, 0, 1), ('delete', 1, 3, 1, 1), ('equal', 3, 6, 1, 4)]


#hash演算法    hashlib模組
>>> import hashlib
>>> hashlib.algorithms    #所有可使用的hash演算法
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
>>> k=hashlib.md5()      #與下一行效果一樣
>>> k2=hashlib.new('md5')   #可以動態指定hash演算法
>>> str='haha'
>>> k.update(str)       #!!!!注意是在原有的字串後加新字串,所以要計算另一個字串的hash值需要新建一個hash物件
>>> print k.digest()     #二進位制下
NMl3+o?caq?%
>>> print k.hexdigest()    #16進位制下
4e4d6c332b6fe62a63afe56171fd3725


>>> threads=[]
>>> def t():
...   threads.append(4)
...
>>> t()
>>> threads
[4]               #說明在函式中可以訪問全域性變數
>>> def t():
...   threads=[3,4,5]
...   threads.append(9)
...
>>> threads
[4]
>>> t()
>>> threads
[4]               #說明區域性變數對全域性變數有遮蔽現象
    
    
#多執行緒方法   threading模組(thread模組的改進版)  
#python中得thread的一些機制和C/C++不同:在C/C++中,主執行緒結束後,其子執行緒會預設被主執行緒kill掉。而在python中,主執行緒結束後,會預設等待子執行緒結束後,主執行緒才退出。
#python對於thread的管理中有兩個函式:join和setDaemon
#join:如在一個執行緒B中呼叫threada.join(),則threada結束後,執行緒B才會接著threada.join()往後執行。
#setDaemon:主執行緒A啟動了子執行緒B,呼叫b.setDaemaon(True),則主執行緒結束時,會把子執行緒B也殺死,與C/C++中得預設效果是一樣的。
import threading
def show(x,y):
  i=0
  while i<y:
      print '%d: %d' % (x,i)
      i+=1
threads = []
t1 = threading.Thread(target=show,args=(1,9))
threads.append(t1)
t2 = threading.Thread(target=move,args=(2,20))  #並不會直接開始執行
threads.append(t2)                 
if __name__ == '__main__':
  for t in threads:
    t.setDaemon(True)             #將執行緒宣告為守護執行緒,必須在start() 方法呼叫之前設定
    t.start()
for t in threads:
  t.join()
print 'all over'
#其他threading中的函式:
#threading.activeCount()  此方法返回當前程序中執行緒的個數。返回的個數中包含主執行緒。
#threading.enumerate()   此方法返回當前執行中的Thread物件列表。enumerate->列舉、列舉
  
  
#訪問作業系統服務的功能    os模組
os.system('D:\ha.exe')    #執行外部程式,檔名中不能出現空格
os.startfile('D:\ha.exe')   #執行外部程式,檔名中可以出現空格
os.urandom(n)         #返回n位元組的足夠強度加密的隨機數


#對檔案的大量操作       fileinput模組
import fileinput
for line in fileinput.input(list or str,inplace=1 or 0):  #inplace=1表示原地修改
  do something about line
  if fileinput.isfirstline():               #竟然可以直接呼叫fileinput,於是只能存在一個fileinput物件?
    print line                     #若inplace=1,則會輸出到原檔案,而不是到螢幕
#其他fileinput中的函式
#fileinput.lineno()        返回當前行數,累計值
#fileinput.filelineno()      返回當前行數,對每個檔案重新計數
#fileiput.nextfile()       關閉當前檔案,跳到下個檔案,跳過的行並不計數
#fileinput.isfirstline()     若所在行為檔案的第一行則返回True
#fileinput.filename()       返回當前正在處理的檔案的名字


#實用命令 
exec(str)             #把str當成程式碼來執行
#>>> str="print 'haha'"
#>>> exec(str)
#haha
eval(str)             #計算str的結果
#>>> import cmath
#>>> str='1+3+5+cmath.sqrt(8)'
#>>> exec(str)          #於是exec不會有返回值
#>>> eval(str)          #eval返回執行結果
#(11.82842712474619+0j)


#檔案操作(複製刪除等)    shutil模組與os模組
os.path.exists(str)        #判斷該檔案是否存在
os.remove(str)          #刪除檔案
os.rmdir(str)           #刪除空資料夾,若非空則會彈出異常
shutil.rmtree(str)        #刪除資料夾,可以非空
shutil.copyfile( src, dst)    #從源src複製到dst中去。當然前提是目標地址是具備可寫許可權。丟擲的異常資訊為IOException. 如果當前的dst已存在的話就會被覆蓋掉 
shutil.copymode( src, dst)    #只是會複製其許可權其他的東西是不會被複制的 
shutil.copystat( src, dst)    #複製許可權、最後訪問時間、最後修改時間 
shutil.copy( src, dst)      #複製一個檔案到一個檔案或一個目錄 
shutil.copy2( src, dst)      #在copy上的基礎上再複製檔案最後訪問時間與修改時間也複製過來了,類似於cp –p的東西 
shutil.copy2( src, dst)      #如果兩個位置的檔案系統是一樣的話相當於是rename操作,只是改名;如果是不在相同的檔案系統的話就是做move操作 
shutil.copytree(olddir,newdir,True/Flase)  #把olddir拷貝一份newdir,如果第3個引數是True,則複製目錄時將保持資料夾下的符號連線,如果第3個引數是False,則將在複製的目錄下生成物理副本來替代符號連線 


#郵件操作             smtplib模組     
import smtplib
import time
from email.message import Message
smtpserver='smtp.21cn.com'
username='[email protected]'
password='password'
from_addr='[email protected]'
to_addr='[email protected]'
message=Message()
message['Subject']='haha'
message['From']=from_addr
message['To']=to_addr
msg=message.as_string()
sm=smtplib.SMTP(smtpserver,port=25,timeout=10)
sm.login(username,password)
i=0
while i<10:
 sm.sendmail(from_addr,to_addr,msg)
 i+=1
time.sleep(10)
sm.quit()