1. 程式人生 > >Python基礎----模塊2

Python基礎----模塊2

系統 pla 打印 反序列化 技術 mage dll pac 自定義

sys模塊

sys模塊提供了一系列有關Python運行環境的變量和函數。

技術分享
1 #重點記憶
2 sys.argv           #命令行參數List,第一個元素是程序本身路徑
3 sys.exit(n)        #退出執行的程序未見,正常退出時exit(0),不同於循環用的break跳出循環
4 sys.path           #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
5 
6 #一般
7 sys.platform       #返回操作系統平臺名稱
8 sys.version        #獲取Python解釋程序的版本信息
9 sys.maxint         #最大的Int值
技術分享

詳細說明:

sys.argv方法:返回值為命令行操作的列表,模擬sql登錄代碼

技術分享
 1 res=sys.argv
 2 print(res)
 3 username=res[2]
 4 password=res[4]
 5 if res[1] == ‘-u‘ and res[3] == ‘-p‘:
 6     if username == ‘bob‘ and password == ‘123‘:
 7         print(‘loging successful‘)
 8 else:
 9     print(‘格式不對‘)
10 
11 cmd調用
12 C:\Users\Mr.chai\Desktop\PythonProject\筆記\2017.6.22>python 模塊2.py -u bob -p 123
13 [‘模塊2.py‘, ‘-u‘, ‘bob‘, ‘-p‘, ‘123‘]  #sys.argv返回值
14 loging successful
技術分享

sys.path:返回模塊的搜索路徑,初始化時用PYTHONPATH環境變量的值

技術分享
1 #pycharm下執行
2 print(sys.path)
3 輸出結果:
4 [‘C:\\Users\\Mr.chai\\Desktop\\PythonProject\\筆記\\2017.6.22‘, ‘C:\\Users\\Mr.chai\\Desktop\\PythonProject‘, ‘C:\\Python36\\python36.zip‘, ‘C:\\Python36\\DLLs‘, ‘C:\\Python36\\lib‘, ‘C:\\Python36‘, ‘C:\\Python36\\lib\\site-packages‘]
5 
6 #cmd下執行
7 C:\Users\Mr.chai\Desktop\PythonProject\筆記\2017.6.22>python 模塊2.py
8 [‘C:\\Users\\Mr.chai\\Desktop\\PythonProject\\筆記\\2017.6.22‘, ‘C:\\Python36\\python36.zip‘, ‘C:\\Python36\\DLLs‘, ‘C:\\Python36\\lib‘, ‘C:\\Python36‘, ‘C:\\Python36\\lib\\site-packages‘]
技術分享

pycharm下執行的‘C:\\Users\\Mr.chai\\Desktop\\PythonProject‘是pycharm給加的,以cmd下調用為準

找模塊的優先級:內置模塊(即python解釋器下的目錄)---第三方模塊和自定義模塊,會統一按照一個路徑去找(執行文件或者導入會將目錄加到sys.path下,默認加到前面)

導入自定義模塊的時候,如果模塊名和python解釋器下的第三方模塊沖突會優先到當前導入自定義模塊目錄文件下找。

內置模塊:sys、time、os模塊(測試的不太確認)

當自定義的模塊需要跨目錄調用的時候,需要在調用的py文件下手動加上要調用的模塊的目錄:

1 sys.path.append(‘module路徑‘)

logging模塊

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

默認日誌會輸出到當前屏幕終端

1 import logging  
2 logging.debug(‘debug message‘)  
3 logging.info(‘info message‘)  
4 logging.warning(‘warning message‘)  
5 logging.error(‘error message‘)  
6 logging.critical(‘critical message‘)  

日誌格式配置(不推薦該配置方式):

技術分享
 1 import logging  
 2 logging.basicConfig(level=logging.DEBUG,  #默認級別設置
 3                     format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,    #日誌輸出格式
 4                     datefmt=‘%a, %d %b %Y %H:%M:%S‘,    #時間輸出格式
 5                     filename=‘/tmp/test.log‘,    #日誌輸出目錄
 6                     filemode=‘w‘)    #文件寫入權限,a或w
 7   
 8 logging.debug(‘debug message‘)  
 9 logging.info(‘info message‘)  
10 logging.warning(‘warning message‘)  
11 logging.error(‘error message‘)  
12 logging.critical(‘critical message‘)
技術分享

配置參數:

技術分享
 1 logging.basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有:
 2 
 3 filename:用指定的文件名創建FiledHandler,這樣日誌會被存儲在指定的文件中。
 4 filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
 5 format:指定handler使用的日誌顯示格式。
 6 datefmt:指定日期時間格式。
 7 level:設置rootlogger(後邊會講解具體概念)的日誌級別
 8 stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。
 9 
10 format參數中可能用到的格式化串:
11 %(name)s Logger的名字
12 %(levelno)s 數字形式的日誌級別
13 %(levelname)s 文本形式的日誌級別
14 %(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
15 %(filename)s 調用日誌輸出函數的模塊的文件名
16 %(module)s 調用日誌輸出函數的模塊名
17 %(funcName)s 調用日誌輸出函數的函數名
18 %(lineno)d 調用日誌輸出函數的語句所在的代碼行
19 %(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
20 %(relativeCreated)d 輸出日誌信息時的,自Logger創建以 來的毫秒數
21 %(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
22 %(thread)d 線程ID。可能沒有
23 %(threadName)s 線程名。可能沒有
24 %(process)d 進程ID。可能沒有
25 %(message)s用戶輸出的消息
技術分享

日誌對象配置:(推薦日誌配置方式)

技術分享
 1 #使用logger對象
 2 logger_obj=logging.getLogger()
 3 
 4 # 屏幕輸出流
 5 cp=logging.StreamHandler()
 6 # 文件輸出流
 7 fp=logging.FileHandler(‘logger.txt‘)
 8 
 9 #定義格式對象
10 formatter=logging.Formatter(‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘)
11 
12 #設置格式
13 cp=cp.setFormatter(formatter)
14 fp=fp.setFormatter(formatter)
15 
16 #定義默認級別
17 logger_obj.setLevel(logging.DEBUG)
18 
19 #輸出流定義
20 logger_obj.addHandler(fp)
21 logger_obj.addHandler(cp)
22 
23 logger_obj.debug(‘log info‘)
24 logger_obj.info(‘log error‘)
25 logger_obj.warning(‘log error‘)
26 logger_obj.error(‘log error‘)
27 logger_obj.critical(‘log error‘)
技術分享

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

序列化模塊

把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化

python內部使用的序列化模塊是pickle模塊,而不同編程語言之間使用的是json模塊

json模塊

如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸。JSON不僅是標準格式,並且比XML更快,而且可以直接在Web頁面中讀取,非常方便。

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

技術分享

技術分享
 1 #----------------------------序列化
 2 import json
 3 dic={‘name‘:‘alvin‘,‘age‘:23,‘sex‘:‘male‘}
 4 print(type(dic))#<class ‘dict‘>
 5 data=json.dumps(dic)
 6 print("type",type(data))#<class ‘str‘>
 7 print("data",data)
 8 f=open(‘序列化對象‘,‘w‘)
 9 f.write(data)  #等價於json.dump(dic,f),等同於打開文件和寫入文件兩步
10 f.close()
11 
12 #-----------------------------反序列化<br>
13 import json
14 f=open(‘序列化對象‘)
15 new_data=json.loads(f.read())#  等價於data=json.load(f),打開文件和讀數據
16 print(type(new_data))
技術分享

pickle模塊

技術分享
 1 ##----------------------------序列化
 2 import pickle
 3 dic={‘name‘:‘alvin‘,‘age‘:23,‘sex‘:‘male‘}
 4 print(type(dic))#<class ‘dict‘>
 5 j=pickle.dumps(dic)
 6 print(type(j))#<class ‘bytes‘>
 7 f=open(‘序列化對象_pickle‘,‘wb‘)#註意是w是寫入str,wb是寫入bytes,j是‘bytes‘
 8 f.write(j)  #-------------------等價於pickle.dump(dic,f)
 9 f.close()
10 
11 #-------------------------反序列化
12 import pickle
13 f=open(‘序列化對象_pickle‘,‘rb‘)
14 data=pickle.loads(f.read())#  等價於data=pickle.load(f)
15 print(data[‘age‘])    
技術分享

Python基礎----模塊2