Python基礎(12)_python模塊之sys模塊、logging模塊、序列化json模塊、pickle模塊、shelve模塊

五、sys模塊

sys.argv           命令行參數List,第一個元素是程序自己路徑
sys.exit(n)        退出程序,正常退出時exit(0)
sys.version        獲取Python解釋程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       返回操做系統平臺名稱

 5.1 使用sys.argv進行登陸判斷,跳過 i/o阻塞python

#使用sys.argv進行登陸判斷,跳過 i/o阻塞
import sys
ret=sys.argv
name=ret[ret.index('-u')+1]
passwd=ret[ret.index('-p')+1]
if name=='egon' and passwd=='666':
    print('login successful')

>>:
D:\Pycharm Workspace\Day13>python 課上練習1.py -p 666 -u egon
login successful

5.2 sys.path 介紹與使用web

基本概念shell

sys.path指定用於模塊搜索路徑的字符串列表。默認狀況下python導入文件或者模塊的話,他會先在sys.path裏找模塊的路徑。若是沒有的話,程序就會報錯。編程

它根據環境變量PYTHONPATH進行初始化,再加上安裝時的默認值。json

>>> import sys
>>> sys.path
['', 'D:\\Develop\\python\\Python36\\python36.zip', 'D:\\Develop\\python\\Python36\\DLLs', 'D:\\Develop\\python\\Python36\\lib', 'D:\\Develop\\python\\Python36', 'D:\\Develop\\python\\Python36\\lib\\site-packages']

一、此列表的第一項path[0],在程序啓動時初始化,是包含調用Python解釋器的腳本的目錄,後面爲python環境所在目錄vim

二、ath[0]是空字符串,表示Python首先搜索當前目錄中的模塊,即優先尋找腳本同一級目錄下模塊。若同一級目錄下有同名的第三方模塊空模塊,則在調用模塊是會出錯。網絡

三、本身寫程序的話。最好把本身的模塊路徑給加到當前模塊掃描的路徑裏,eg: sys.path.append('你的模塊的名稱'),或者sys.path.insert(0,'模塊的名稱'),這樣程序就不會由於找不到模塊而報錯,此添加但在退出python環境後本身添加的路徑就會自動消失!  app

永久添加路徑到sys.path中,方式有三,以下:編程語言

1)將寫好的py文件放到 /usr/lib/python3.6/site-packages 目錄下 函數

2) 在 /usr/lib/python3.6/site-packages 下面新建一個.pth 文件(以pth做爲後綴名) 

將模塊的路徑寫進去,一行一個路徑,如: vim pythonmodule.pth

/home/liu/shell/config

/home/liu/shell/base 

3) 使用PYTHONPATH環境變量

export PYTHONPATH=$PYTHONPATH:/home/liu/shell/config

查找模塊的優先級:

  一、內置模塊(python解釋器)====》二、第三方模塊和自定義模塊(sys.path)

六、logging模塊

6.1 函數式簡單配置

logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message') 

  默認狀況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG),默認的日誌格式爲日誌級別:Logger名稱:用戶輸出消息。

靈活配置日誌級別,日誌格式,輸出位置:

import logging
'''
一:若是不指定filename,則默認打印到終端
二:指定日誌級別:
    指定方式:
        1:level=10
        2:level=logging.ERROR

    日誌級別種類:
        CRITICAL = 50
        FATAL = CRITICAL
        ERROR = 40
        WARNING = 30
        WARN = WARNING
        INFO = 20
        DEBUG = 10
        NOTSET = 0

三:指定日誌級別爲ERROR,則只有ERROR及其以上級別的日誌會被打印
'''


logging.basicConfig(filename='access.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log') #若是level=40,則只有logging.critical和loggin.error的日誌會被打印

配置參數:

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用戶輸出的消息

6.2 logger對象配置

import logging

logger = logging.getLogger()
# 建立一個handler,用於寫入日誌文件
fh = logging.FileHandler('test.log')

# 再建立一個handler,用於輸出到控制檯
ch = logging.StreamHandler()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setFormatter(formatter)
ch.setFormatter(formatter)

logger.addHandler(fh) #logger對象能夠添加多個fh和ch對象
logger.addHandler(ch)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

  logging庫提供了多個組件:Logger、Handler、Filter、Formatter。Logger對象提供應用程序可直接使用的接口,Handler發送日誌到適當的目的地,Filter提供了過濾日誌信息的方法,Formatter指定日誌顯示格式。另外,能夠經過:logger.setLevel(logging.Debug)設置級別。

七、序列化模塊

什麼是序列化

  把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化,在Python中叫pickling,在其餘語言中也被稱之爲serialization,marshalling,flattening等等,都是一個意思。序列化以後,就能夠把序列化後的內容寫入磁盤,或者經過網絡傳輸到別的機器上。反過來,把變量內容從序列化的對象從新讀到內存裏稱之爲反序列化,即unpickling。

爲何要序列化:

1:持久保存狀態

  內存是沒法永久保存數據的,當程序運行了一段時間,咱們斷電或者重啓程序,內存中關於這個程序的以前一段時間的數據(有結構)都被清空了。在斷電或重啓程序以前將程序當前內存中全部的數據都保存下來(保存到文件中),以便於下次程序執行可以從文件中載入以前的數據,而後繼續執行,這就是序列化。具體的來講,你玩使命召喚闖到了第13關,你保存遊戲狀態,關機走人,下次再玩,還能從上次的位置開始繼續闖關。或如,虛擬機狀態的掛起等。

2:跨平臺數據交互

  序列化以後,不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼便打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。

7.1 json模塊

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於人閱讀和編寫。

要在不一樣的編程語言之間傳遞對象,就必須把對象序列化爲標準格式,好比XML,但更好的方法是序列化爲JSON,由於JSON表示出來就是一個字符串,能夠被全部語言讀取,也能夠方便地存儲到磁盤或者經過網絡傳輸。JSON不只是標準格式,而且比XML更快,並且能夠直接在Web頁面中讀取,很是方便。

JSON表示的對象就是標準的JavaScript語言的對象一個子集,JSON和Python內置的數據類型對應以下:

python在文本中的使用:

#----------------------------序列化
import json

#dumps序列化
dic={'name':'alvin','age':23,'sex':'male'}
f=open('序列化對象','w')
data=json.dumps(dic)
f.write(data) 
f.close()

#dump序列化
li='1,2,3,4,5'
# f=open('json.txt','a')
# json.dump(li,f)


#-----------------------------反序列化<br>
import json
f=open('序列化對象')
new_data=json.loads(f.read())
print(new_data)

f=open('json.txt',encoding='utf-8')
date=json.load(f)
print(date)

json模塊主要要點:json只認「」雙引號

import json
#dct="{'1':111}"#json 不認單引號
#dct=str({"1":111})#報錯,由於生成的數據仍是單引號:{'one': 1}

dct='{"1":"111"}'
print(json.loads(dct))

#conclusion:
#        不管數據是怎樣建立的,只要知足json格式,就能夠json.loads出來,不必定非要dumps的數據才能loads

注:只要文本內容符合json標準,即便沒有進行json序列化操做也能進行反序列化

7.2 pickle模塊

  Pickle的問題和全部其餘編程語言特有的序列化問題同樣,就是它只能用於Python,而且可能不一樣版本的Python彼此都不兼容,所以,只能用Pickle保存那些不重要的數據,不能成功地反序列化也不要緊

 

import pickle
 
dic={'name':'alvin','age':23,'sex':'male'}
print(type(dic))#<class 'dict'>

j=pickle.dumps(dic)
print(type(j))#<class 'bytes'>
 
f=open('序列化對象_pickle','wb')#注意是w是寫入str,wb是寫入bytes,j是'bytes'
f.write(j)  #-------------------等價於pickle.dump(dic,f)
 
f.close()
#-------------------------反序列化
import pickle
f=open('序列化對象_pickle','rb')
 
data=pickle.loads(f.read())#  等價於data=pickle.load(f)
 
print(data['age'])

7.3 shelve模塊

  shelve模塊與pickle模塊同樣,只適用於python,但比pickle模塊簡單,只有一個open函數,返回相似字典的對象,可讀可寫;key必須爲字符串,而值能夠是python所支持的數據類型

 

import shelve

f=shelve.open(r'sheve.txt')
# f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
# f['stu2_info']={'name':'gangdan','age':53}
# f['school_info']={'website':'http://www.pypy.org','city':'beijing'}

print(f['stu1_info']['hobby'])
f.close()
相關文章
相關標籤/搜索