python模塊第二篇
眾所周知,在我們每個軟件中都存在日誌,有時候出現錯誤時需要上傳日誌,在python語言中,有一個logging模塊,這個就是日誌模塊,主要記錄一些信息,在logging模塊中,有兩種方式,第一種是函數版,另外一種是面向對象版本,先來看看函數版的簡寫版
import logging
logging.debug("你好")
logging.info("你好")
logging.warning("你好")
logging.error("你好")
logging.critical("你好")
在logging模塊中,級別為CRITICAL>ERROR>WARNING>INFO>DEBUG,對應在數字上就是:50.40.30.20.10,我們可以手動修改一下日誌等級
logging.basicConfig(level = logging.DEBUG,或者level = 10)
在默認情況下,在輸出界面輸出的是warning及以上的級別的日誌,寫出來的這個簡寫版日誌,可以用但是不夠靈活,我們可以指定一個模板來使它變得更加靈活
函數版日誌模板
logging.basicConfig(
level=logging.大寫 或者 level=10,20,30,40,50
format=‘%(asctime)s - %(name)s - [%(lineno)d] - %(message)s‘,
filename=‘test.log‘,
filemode =‘a+‘)
logging.debug("你好")
logging.info("你好")
logging.warning("你好")
logging.error("你好")
logging.critical("你好")
logging.basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有:
filename:用指定的文件名創建FiledHandler,這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
format:指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(後邊會講解具體概念)的日誌級別
stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件 (f=open(‘test.log’,’w’)),默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。
format參數中可能用到的格式化串:
%(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用戶輸出的消息
面向對象版的日誌模板
import logging
生成
logger = logging.getLogger(‘可以命名‘) 獲取新的日誌
formatter = logging.Formatter(‘%(asctime)s - %(name)s - [%(lineno)d] - %(message)S‘)定義一個模板:輸出格式
ch = logging.StreamHandler() 生成一個屏幕流
fh = logging.FileHandler(‘.log‘,‘a‘,encoding=‘utf-8‘) 生成一個文件流
boss = logging.FileHandler(‘boss.log‘,‘a‘,encoding=‘utf-8‘) 生成一個新的日誌
boss_formatter = logging.Formatter(‘%(asctime)s-%(message)s‘)
綁定
ch.setFormatter(formatter) 把自己定義的模板綁定給創建的存儲日誌的流
fh.setFormatter(formatter)
boss.setFormatter(boss_formatter) 寫一個新的模板,綁定
logger.addHandler(ch), 將屏幕流加入日誌綁定
logger.addHandler(fh), 將文件流加入日誌綁定
logger.addHandler(boss), 將文件流加入日誌綁定
logger.setLevel(logging,DEBUG) 修改等級
logger.debug(‘你好‘)
logger.info(‘你好‘)
logger.warning(‘你好‘)
logger.error(‘你好‘)
logger.critical(‘你好‘)
函數版和面向對象版之間的區別:
函數版:寫入屏幕和文件二選一,只能在一個地方顯示結果,在文件中默認編碼為GBK
它是python中直接定義好的,可以直接拿來用
面向對象版:寫入屏幕或文件中都可以,支持多個輸出方式,寫入文件中的編碼方式可以自定義
它是我們自己制定的,需要一步一步來操作
序列化模塊
json模塊,將一個對象轉換成能永久存儲的內容,它是多種語言通用的一個模塊,
主要用於字符串和python數據類型之間的轉換,通過dump,load.dumps,loads四個功能來實現
dump:對象轉換成文件-->序列化-->dump(要轉的內容,文件句柄)-->可見文件
load:文件轉換成對象-->反序列化-->load(文件句柄)-->對象
import json
dic = {‘name‘:‘meet‘,‘age‘:‘18‘}
f = open(‘test.txt‘,‘w‘,encoding=‘utf-8‘)
s = json.dump(dic,f))
print(s)
n = json.load(f)
print(n)
lst = [1,2,3,4,5,6]
f = open(‘test.txt‘,‘w‘,encoding=‘utf-8‘)
s1 = json.dump(lst,f))
print(s1)
n1 = json.load(f)
print(n)
dumps:將對象轉換成字符串-->序列化-->dumps(要轉換的對象)-->字符串
loads:將字符串轉換成對象-->反序列化-->loads(要轉化的字符串)-->對象
import json
dic = {‘name‘:‘meet‘,‘age‘:18} s = json.dumps(dic) print(type(s),s) class:‘str‘,{"name":"meet","age":18} n = json.loads(s) print(type(n),n) class:‘dic‘,{‘name‘:‘meet‘,‘age‘:18}
json的格式化輸出:
data = {‘username‘:[‘李華‘,[1,2,3],‘二楞子‘],‘sex‘:‘male‘,‘age‘:16}
json_dic2=json.dumps(data,sort_keys=True,ensure_ascii=False,indent=2,separators=(‘,‘,‘:‘))
ps:
Skipkeys:默認值是False,如果dict的keys內的數據不是python的基本類型(str,unicode,int,long,float,bool,None),設置為False時,就會報TypeError的錯誤。此時設置成True,則會跳過這類key
keys:設置為False時,就會報TypeError錯誤,如果設置成True,就會跳過
sort_keys:根據keys的值進行排序
ensure_ascii:為True時,非ascii碼字符顯示為\u...,設置成False,中文就可以顯示
indent,如果是0,就頂格分行顯示,如果為空,就一行緊湊顯示,否則就換行並按照indent的數值顯示空格
separators:分隔符,實際上是(item_separator,dict_separator)的一個元組,默認的就是(‘,‘,‘:‘);
這表示dictionary內keys之間用","隔開,而Key和value之間用":"隔開。
pickle模塊
pickle模塊,將一個對象轉換成能永久存儲的內容,它是python特有的模塊類型,可以把目前所知(除lambda以外)的數據類型進行轉換,
主要通過dump,load.dumps,loads四個功能來實現
dump:對象轉成文件-->序列化-->dump(要轉換的對象,文件句柄)-->文件(不可見)
load:文件轉換為對象-->反序列化-->load(文件句柄)-->對象
f = open(‘文件名‘,‘wb‘)
dic = {1:2,2:3}
pickle.dump(dic,f)
f = open(‘文件名‘,‘rb‘)
s = pickle.load(f)
print(type(s),s)
dumps:對象轉換成字節-->序列化-->dumps(要轉換的對象)-->字節
loads:字節轉換成對象-->反序列化-->loads(要轉換的字節)-->對象
dic = {‘name‘:‘yiyi‘,‘age‘:18} s = pickle.dumps(dic) print(type(s),s) class:bytes,b‘\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00yiyiq\x02X\x03\x00\x00\x00ageq\x03K\x12u.‘ c = pickle.loads(s) print(type(c),c) class:dic,{‘name‘:‘yiyi‘,‘age‘:18}
random模塊
random是一個隨機模塊,一般用來生成一些沒有規律的內容
import random 0-1之間的小數: random.random() 指定數字之間隨機小數: random.uniform(1,5) 隨機整數: random.randint(0,36),可以指定 隨機偶數: random.randrange(0,10,2) 隨機奇數: random,randrange(1,10,2)
除了數字,我們還可以在可叠代對象中隨機抽取
lst = [12,3,5,56,32,45]
random.choice(lst) 隨機抽取一個
random.choices(lst,k= ) 隨機抽取多個,但有重復,可以指定k的值
random.sample(lst,k= ) 隨機抽取多個,沒有重復,可以指定k的值
random.shuffle(lst) 打散順序
隨機取字母: random.randrange(65,91)
python模塊第二篇