本節內容python
一、模塊介紹git
二、time&datetime模塊shell
四、os模塊json
五、sys模塊bash
七、logging模塊dom
1、模塊介紹 |
模塊,是一堆代碼實現了某個功能的代碼集合。函數式編程
相似於函數式編程和麪向過程編程,函數式編程則完成一個功能,其餘代碼用來調用便可,提供了代碼的重用性和代碼間的耦合函數
而對於一個複雜的功能來,可能須要多個函數才能完成(函數又能夠在不一樣的.py文件中),n個 .py 文件組成的代碼集合就稱爲模塊
如:os 是系統相關的模塊;file是文件操做相關的模塊
模塊分爲三種:
自定義模塊
內置標準模塊(又稱標準庫)
開源模塊
2、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年
時間戳與時間字符串相互轉化以下:
3、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)))
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所指向的文件或者目錄的最後修改時間
5、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]
6、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)
7、logging模塊 |
一、基本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 |
用戶輸出的消息 |
二、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 天天凌晨