Python自動化開發 - 經常使用模塊(一)

本節內容python

一、模塊介紹git

二、time&datetime模塊shell

三、random模塊編程

四、os模塊json

五、sys模塊bash

六、json&pickle模塊網絡

七、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 天天凌晨

相關文章
相關標籤/搜索