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.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用戶輸出的消息
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:跨平臺數據交互
序列化以後,不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼便打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。
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
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'])
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()