1. 程式人生 > >python模塊第二篇

python模塊第二篇

模塊 random led roo 情況下 span 文件 date 規律

  眾所周知,在我們每個軟件中都存在日誌,有時候出現錯誤時需要上傳日誌,在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模塊第二篇