Python自動化開發 - 常用模塊(一)
本節內容
1、模塊介紹
2、time&datetime模塊
3、random模塊
4、os模塊
5、sys模塊
6、json&pickle模塊
7、logging模塊
一、模塊介紹
模塊,是一堆代碼實現了某個功能的代碼集合。
類似於函數式編程和麪向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合
而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱爲模塊
如:os 是系統相關的模塊;file是文件操作相關的模塊
模塊分爲三種:
自定義模塊
內置標準模塊(又稱標準庫)
開源模塊
time&datetime模塊
import time
import datetime
print(time.time()) # 通用OS誕生元年至今時間戳
t = time.localtime() # 返回本地時間的struct time對象格式
print(t) # 可用於定製化輸出
print("%s-%s-%s %s:%s:%s" % (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec))
print(time.gmtime()) # 返回utc時間的struc時間對象格式
# 日期字符串轉成時間戳
string_2_struct = time.strptime("2017/02/20", "%Y/%m/%d") # 將日期字符串轉成struct時間對象格式
print(string_2_struct)
struct_2_stamp = time.mktime(string_2_struct) # 將struct時間對象轉成時間戳
print(struct_2_stamp)
# 將時間戳轉爲字符串格式
print(time.gmtime(time.time()-86640)) # 將utc時間戳轉換成struct_time格式
print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())) # 將utc struct_time格式轉成指定的字符串格式
# 時間加減
print(datetime.datetime.now()) # 返回系統當前時刻 2017-02-18 15:59:33.948776
print(time.time()) # 時間戳
print(datetime.date.fromtimestamp(time.time())) # 時間戳直接轉成日期格式 2017-02-18
print(datetime.datetime.now())
print(datetime.datetime.now() + datetime.timedelta(hours=1, minutes=10)) # 當前時間加1小時,10分鐘
print(datetime.datetime.now().replace(year=2016)) # 時間替換爲2016年
random模塊
import random
import string
print(random.randint(1, 10)) # 隨機1-10,包括10的任意整數
print(random.randrange(1, 20, 2)) # 隨機1-20,步長爲2,但不包括20,隨機整數
print(random.sample(range(100), 2)) # 從源列表中任意取2的元素,組成列表
# 生成4位驗證碼
source = string.ascii_uppercase + string.digits
print("".join(random.sample(source, 4)))
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.maxsize # 最大的Int值
sys.path # 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform # 返回操作系統平臺名稱
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
json&pickle模塊
用於序列化的兩個模塊
json,用於字符串 和 python數據類型間進行轉換
pickle,用於python特有的類型 和 python的數據類型間進行轉換
Json模塊提供了四個功能:dumps、dump、loads、load
pickle模塊提供了四個功能:dumps、dump、loads、load
import pickle
# 更新數據到文檔
account = {
"id": 1234,
"password": "abc",
"credit": 15000,
"balance": 8000
}
f = open("account.db", "wb")
pickle.dump(account, f)
f.close()
# 從文件讀取數據
f = open("account.db", "rb")
account = pickle.load(f)
f.close()
print(account)
logging模塊
1、基本log功能
很多程序都有記錄日誌的需求,並且日誌中包含的信息既有正常的程序訪問日誌,還可能有錯誤、警告等信息輸出,
Python的logging模塊提供了標準的日誌接口,你可以通過它存儲各種格式的日誌,
logging的日誌可以分爲 debug(), info(), warning(), error() and critical() 5個級別,下面我們看一下簡單輸出信息
logging.warning("user [Jonathan] attempted wrong password more than 3 times")
logging.critical("server is down")
# 輸出結果
WARNING:root:user [Jonathan] attempted wrong password more than 3 times
CRITICAL:root:server is down
瞭解幾個日誌級別代表什麼意思
級別 數字 簡介
DEBUG 10 調試信息
INFO 20 程序正常運行確認信息
WARNING 30 程序告警,或者即將出現的情況(如,磁盤空間不足),但程序仍然可以運行
ERROR 40 程序錯誤,一些功能不能運行
CRITICAL 40 嚴重錯誤,程序不能運行
import logging
logging.basicConfig(filename='example.log',level=logging.INFO)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
'''
level=loggin.INFO意思是,把日誌紀錄級別設置爲INFO,也就是說,只有比日誌是INFO或比INFO級別更高的日誌纔會被紀錄到文件裏。
在這個例子, 第一條日誌是不會被紀錄的,如果希望紀錄debug的日誌,那把日誌級別改成DEBUG就行了
'''
日誌格式加上時間
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
日誌格式總結如下
%(name)s
Logger的名字
%(levelno)s
數字形式的日誌級別
%(levelname)s
文本形式的日誌級別
%(pathname)s
調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s
調用日誌輸出函數的模塊的文件名
%(module)s
調用日誌輸出函數的模塊名
%(funcName)s
調用日誌輸出函數的函數名
%(lineno)d
調用日誌輸出函數的語句所在的代碼行
%(created)f
當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d
輸出日誌信息時的,自Logger創建以 來的毫秒數
%(asctime)s
字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d
線程ID。可能沒有
%(threadName)s
線程名。可能沒有
%(process)d
進程ID。可能沒有
%(message)s
用戶輸出的消息
2、log打印到屏幕和文件日誌
Python 使用logging模塊記錄日誌涉及四個主要類:
logger提供了應用程序可以直接使用的接口;
handler將(logger創建的)日誌記錄發送到合適的目的輸出;
filter提供了細度設備來決定輸出哪條日誌記錄;
formatter決定日誌記錄的最終輸出格式。
它們之間的關係如下圖所示
logger
每個程序在輸出信息之前都要獲得一個logger。logger通常對應了程序的模塊名,比如聊天工具的圖形界面模塊可以這樣獲得它的logger:
LOG = logging.getLogger(”chat.gui”)
而核心模塊可以這樣:
LOG=logging.getLogger(”chat.kernel”)
logger.setLevel(lel):指定最低的日誌級別,低於lel的級別將被忽略。DEBUG是最低的內置級別,CRITICAL爲最高
logger.addFilter(filt)、logger.removeFilter(filt):添加或刪除指定的filter
logger.addHandler(hdlr)、logger.removeHandler(hdlr):增加或刪除指定的handler
logger.debug()、logger.info()、logger.warning()、logger.error()、logger.critical():可以設置的日誌級別
handler
handler對象負責發送相關的信息到指定目的地。
Python的日誌系統有多種Handler可以使用。
有些Handler可以把信息輸出到控制檯;
有些Logger可以把信息輸出到文件;
還有些 Handler可以把信息發送到網絡上;
如果覺得不夠用,還可以編寫自己的Handler
可以通過addHandler()方法添加多個多handler
Handler.setLevel(lel):指定被處理的信息級別,低於lel級別的信息將被忽略
Handler.setFormatter():給這個handler選擇一個格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象
每個Logger可以附加多個Handler。接下來我們就來介紹一些常用的Handler:
1) logging.StreamHandler
使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息。它的構造函數是:
StreamHandler([strm])
其中strm參數是一個文件對象。默認是sys.stderr
2) logging.FileHandler
和StreamHandler類似,用於向一個文件輸出日誌信息。不過FileHandler會幫你打開這個文件。它的構造函數是:
FileHandler(filename[,mode])
filename是文件名,必須指定一個文件名。
mode是文件的打開方式。參見Python內置函數open()的用法。默認是’a',即添加到文件末尾
3) logging.handlers.RotatingFileHandler
這個Handler類似於上面的FileHandler,但是它可以管理文件大小。當文件達到一定大小之後,它會自動將當前日誌文件改名,
然後創建 一個新的同名日誌文件繼續輸出。比如日誌文件是chat.log。當chat.log達到指定的大小之後,
RotatingFileHandler自動把 文件改名爲chat.log.1。
不過,如果chat.log.1已經存在,會先把chat.log.1重命名爲chat.log.2。。。最後重新創建 chat.log,繼續輸出日誌信息。它的構造函數是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode兩個參數和FileHandler一樣。
maxBytes用於指定日誌文件的最大文件大小。如果maxBytes爲0,意味着日誌文件可以無限大,這時上面描述的重命名過程就不會發生。
backupCount用於指定保留的備份文件的個數。比如,如果指定爲2,當上面描述的重命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除
4) logging.handlers.TimedRotatingFileHandler
Handler和RotatingFileHandler類似,不過,它沒有通過判斷文件大小來決定何時重新創建日誌文件,而是間隔一定時間就自動創建新的日誌文件
重命名的過程與RotatingFileHandler類似,不過新的文件不是附加數字,而是當前時間。它的構造函數是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其中filename參數和backupCount參數和RotatingFileHandler具有相同的意義。
interval是時間間隔。
when參數是一個字符串。表示時間間隔的單位,不區分大小寫。它有以下取值:
S 秒
M 分
H 小時
D 天
W 每星期(interval==0時代表星期一)
midnight 每天凌晨