作者:武沛齊出處:http://www.cnblogs.com/wupeiqi/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。模塊,用一砣代碼實現了某個功能的代碼集合。類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用...
作者:武沛齊
出處:http://www.cnblogs.com/wupeiqi/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
模塊,用一砣代碼實現了某個功能的代碼集合。
類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。
如:os 是系統相關的模塊;file是文件操作相關的模塊
模塊分為三種:
- 自定義模塊
- 內置模塊
- 開源模塊
自定義模塊
1、定義模塊
情景一:
情景二:
情景三:
2、導入模塊
Python之所以應用越來越廣泛,在一定程度上也依賴於其為程式員提供了大量的模塊以供使用,如果想要使用模塊,則需要導入。導入模塊有一下幾種方法:
1 2 3 4 |
import module
from module.xx.xx import xx
from module.xx.xx import xx as rename
from module.xx.xx import *
|
導入模塊其實就是告訴Python解釋器去解釋那個py文件
- 導入一個py文件,解釋器解釋該py文件
- 導入一個包,解釋器解釋該包下的 __init__.py 文件
那麼問題來了,導入模塊時是根據那個路徑作為基準來進行的呢?即:sys.path
1 2 3 4 5 |
import sys
print sys.path
結果:
[ '/Users/wupeiqi/PycharmProjects/calculator/p1/pp1' , '/usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/xlutils-1.7.1-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/xlwt-1.0.0-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/xlrd-0.9.3-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/tornado-4.1-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/certifi-2015.4.28-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/pyOpenSSL-0.15.1-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/six-1.9.0-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/cryptography-0.9.1-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/cffi-1.1.1-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/ipaddress-1.0.7-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/enum34-1.0.4-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/idna-2.0-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/pycparser-2.13-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/Django-1.7.8-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/paramiko-1.10.1-py2.7.egg' , '/usr/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-x86_64.egg' , '/usr/local/lib/python2.7/site-packages/greenlet-0.4.7-py2.7-macosx-10.10-x86_64.egg' , '/Users/wupeiqi/PycharmProjects/calculator' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python27.zip' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old' , '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload' , '/usr/local/lib/python2.7/site-packages' , '/Library/Python/2.7/site-packages' ]
|
如果sys.path路徑列表沒有你想要的路徑,可以通過 sys.path.append('路徑') 添加。
通過os模塊可以獲取各種目錄,例如:
import sys import os pre_path = os.path.abspath('../') sys.path.append(pre_path)
開源模塊
一、下載安裝
下載安裝有兩種方式:
yum pip apt-get ...
下載源碼 解壓源碼 進入目錄 編譯源碼 python setup.py build 安裝源碼 python setup.py install
註:在使用源碼安裝時,需要使用到gcc編譯和python開發環境,所以,需要先執行:
1 2 3 4 |
yum install gcc
yum install python - devel
或
apt - get python - dev
|
安裝成功後,模塊會自動安裝到 sys.path 中的某個目錄中,如:
1 |
/ usr / lib / python2. 7 / site - packages /
|
二、導入模塊
同自定義模塊中導入的方式
三、模塊 paramiko
paramiko是一個用於做遠程式控制制的模塊,使用該模塊可以對遠程伺服器進行命令或文件操作,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。
1、下載安裝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# pycrypto,由於 paramiko 模塊內部依賴pycrypto,所以先下載安裝pycrypto
# 下載安裝 pycrypto
wget http: / / files.cnblogs.com / files / wupeiqi / pycrypto - 2.6 . 1.tar .gz
tar - xvf pycrypto - 2.6 . 1.tar .gz
cd pycrypto - 2.6 . 1
python setup.py build
python setup.py install
# 進入python環境,導入Crypto檢查是否安裝成功
# 下載安裝 paramiko
wget http: / / files.cnblogs.com / files / wupeiqi / paramiko - 1.10 . 1.tar .gz
tar - xvf paramiko - 1.10 . 1.tar .gz
cd paramiko - 1.10 . 1
python setup.py build
python setup.py install
# 進入python環境,導入paramiko檢查是否安裝成功
|
2、使用模塊
執行命令 - 通過用戶名和密碼連接伺服器 執行命令 - 過密鑰鏈接伺服器 上傳或者下載文件 - 通過用戶名和密碼 上傳或下載文件 - 通過密鑰內置模塊
一、os
用於提供系統級別的操作
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd os.curdir 返回當前目錄: ('.') os.pardir 獲取當前目錄的父目錄字元串名:('..') os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep 輸出用於分割文件路徑的字元串 os.name 輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix' os.system("bash command") 運行shell命令,直接顯示 os.environ 獲取系統環境變數 os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對路徑,返回True os.path.isfile(path) 如果path是一個存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間
更多猛擊這裡
二、sys
用於提供對解釋器相關的操作
sys.argv 命令行參數List,第一個元素是程式本身路徑 sys.exit(n) 退出程式,正常退出時exit(0) sys.version 獲取Python解釋程式的版本信息 sys.maxint 最大的Int值 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值 sys.platform 返回操作系統平臺名稱 sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
更多猛擊這裡
三、hashlib
用於加密相關的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法
md5-廢棄 sha-廢棄1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import hashlib
# ######## md5 ########
hash = hashlib.md5()
hash .update( 'admin' )
print hash .hexdigest()
# ######## sha1 ########
hash = hashlib.sha1()
hash .update( 'admin' )
print hash .hexdigest()
# ######## sha256 ########
hash = hashlib.sha256()
hash .update( 'admin' )
print hash .hexdigest()
# ######## sha384 ########
hash = hashlib.sha384()
hash .update( 'admin' )
print hash .hexdigest()
# ######## sha512 ########
hash = hashlib.sha512()
hash .update( 'admin' )
print hash .hexdigest()
|
以上加密演算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,有必要對加密演算法中添加自定義key再來做加密。
1 2 3 4 5 6 7 |
import hashlib
# ######## md5 ########
hash = hashlib.md5( '898oaFs09f' )
hash .update( 'admin' )
print hash .hexdigest()
|
還不夠弔?python 還有一個 hmac 模塊,它內部對我們創建 key 和 內容 再進行處理然後再加密
1 2 3 4 |
import hmac
h = hmac.new( 'wueiqi' )
h.update( 'hellowo' )
print h.hexdigest()
|
不能再牛逼了!!!
四、json 和 pickle
用於序列化的兩個模塊
- json,用於字元串 和 python數據類型間進行轉換
- pickle,用於python特有的類型 和 python的數據類型間進行轉換
Json模塊提供了四個功能:dumps、dump、loads、load
pickle模塊提供了四個功能:dumps、dump、loads、load
五、執行系統命令
可以執行shell命令的相關模塊和函數有:
- os.system
- os.spawn*
- os.popen* --廢棄
- popen2.* --廢棄
- commands.* --廢棄,3.x中被移除
以上執行shell命令的相關的模塊和函數的功能均在 subprocess 模塊中實現,並提供了更豐富的功能。
call
執行命令,返回狀態碼
1 2 |
ret = subprocess.call([ "ls" , "-l" ], shell = False )
ret = subprocess.call( "ls -l" , shell = True )
|
shell = True ,允許 shell 命令是字元串形式
check_call
執行命令,如果執行狀態碼是 0 ,則返回0,否則拋異常
1 2 |
subprocess.check_call([ "ls" , "-l" ])
subprocess.check_call( "exit 1" , shell = True )
|
check_output
執行命令,如果狀態碼是 0 ,則返回執行結果,否則拋異常
1 2 |
subprocess.check_output([ "echo" , "Hello World!" ])
subprocess.check_output( "exit 1" , shell = True )
|
subprocess.Popen(...)
用於執行複雜的系統命令
參數:
- args:shell命令,可以是字元串或者序列類型(如:list,元組)
- bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝
- stdin, stdout, stderr:分別表示程式的標準輸入、輸出、錯誤句柄
- preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用
- close_sfs:在windows平臺下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
所以不能將close_fds設置為True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。 - shell:同上
- cwd:用於設置子進程的當前目錄
- env:用於指定子進程的環境變數。如果env = None,子進程的環境變數將從父進程中繼承。
- universal_newlines:不同系統的換行符不同,True -> 同意使用 \n
- startupinfo與createionflags只在windows下有效
將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主視窗的外觀,進程的優先順序等等
終端輸入的命令分為兩種:
- 輸入即可得到輸出,如:ifconfig
- 輸入進行某環境,依賴再輸入,如:python
更多猛擊這裡
六、shutil
高級的 文件、文件夾、壓縮包 處理模塊
shutil.copyfileobj(fsrc, fdst[, length])
將文件內容拷貝到另一個文件中,可以部分內容
shutil.copyfile(src, dst)
拷貝文件
shutil.copymode(src, dst)
僅拷貝許可權。內容、組、用戶均不變
shutil.copystat(src, dst)
拷貝狀態的信息,包括:mode bits, atime, mtime, flags
shutil.copy(src, dst)
拷貝文件和許可權
shutil.copy2(src, dst)
拷貝文件和狀態信息
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞歸的去拷貝文件
例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
View Codeshutil.rmtree(path[, ignore_errors[, onerror]])
遞歸的去刪除文件
shutil.move(src, dst)
遞歸的去移動文件
shutil.make_archive(base_name, format,...)
創建壓縮包並返迴文件路徑,例如:zip、tar
- base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑,
如:www =>保存至當前路徑
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/ - format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要壓縮的文件夾路徑(預設當前目錄)
- owner: 用戶,預設當前用戶
- group: 組,預設當前組
- logger: 用於記錄日誌,通常是logging.Logger對象
1 2 3 4 5 6 7 8 9 |
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當前程式目錄
import shutil
ret = shutil.make_archive( "wwwwwwwwww" , 'gztar' , root_dir = '/Users/wupeiqi/Downloads/test' )
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目錄
import shutil
ret = shutil.make_archive( "/Users/wupeiqi/wwwwwwwwww" , 'gztar' , root_dir = '/Users/wupeiqi/Downloads/test' )
|
shutil 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模塊來進行的,詳細:
zipfile 壓縮解壓 tarfile 壓縮解壓 ZipFile TarFile七、ConfigParser
用於對特定的配置進行操作,當前模塊的名稱在 python 3.x 版本中變更為 configparser。
1 2 3 4 5 6 7 8 9 |
# 註釋1
; 註釋 2
[section1]
k1 = v1
k2:v2
[section2]
k1 = v1
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import ConfigParser
config = ConfigParser.ConfigParser()
config.read( 'i.cfg' )
# ########## 讀 ##########
#secs = config.sections()
#print secs
#options = config.options('group2')
#print options
#item_list = config.items('group2')
#print item_list
#val = config.get('group1','key')
#val = config.getint('group1','key')
# ########## 改寫 ##########
#sec = config.remove_section('group1')
#config.write(open('i.cfg', "w"))
#sec = config.has_section('wupeiqi')
#sec = config.add_section('wupeiqi')
#config.write(open('i.cfg', "w"))
#config.set('group2','k1',11111)
#config.write(open('i.cfg', "w"))
#config.remove_option('group2','age')
#config.write(open('i.cfg', "w"))
|
八、logging
用於便捷記錄日誌且線程安全的模塊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import logging
logging.basicConfig(filename = 'log.log' ,
format = '%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s' ,
datefmt = '%Y-%m-%d %H:%M:%S %p' ,
level = 10 )
logging.debug( 'debug' )
logging.info( 'info' )
logging.warning( 'warning' )
logging.error( 'error' )
logging.critical( 'critical' )
logging.log( 10 , 'log' )
|
對於等級:
1 2 3 4 5 6 7 8 |
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
|
只有大於當前日誌等級的操作才會被記錄。
對於格式,有如下屬性可是配置:
九、time
時間相關的操作,時間有三種表示方式:
- 時間戳 1970年1月1日之後的秒,即:time.time()
- 格式化的字元串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 結構化時間 元組包含了:年、日、星期等... time.struct_time 即:time.localtime()