一、sys模塊
1、sys.argv
命令行參數List,第一個元素是程序本身路徑
2、sys.exit(n)
退出程序,正常退出時exit(0)
3、sys.version 、 sys.maxint
sys.version 獲取Python解釋程序的版本信息
sys.maxint 最大的Int值
4、sys.path
返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
分析:sys.path輸出的第一個結果是程序執行文件所在的文件夾絕對路徑,這里的輸出結果第二個是工程文件目錄,但是這個目錄是pycharm自主加上的,直接用解釋器執行是沒有這個路徑的。
5、sys.platform
返回操作系統平台名稱
6、sys.stdout.write() 、sys.stdout.flush()
sys.stdout.write() 標准輸出 , sys.stdout.write 在交互器模式下這個函數輸出數據到stdout,同時還有一個返回值,就是字符串的長度。在pycharm里輸出不會有字符串的長度。
sys.stdout.flush() 刷新輸出
在Linux系統下,必須加入sys.stdout.flush()才能一秒輸一個字符(交互器模式下)
在Windows系統下,加不加sys.stdout.flush()都能一秒輸出一個字符(交互器模式下)
在pycharm里都必須加sys.stdout.flush()才能刷新輸出
例子
需求:做一個簡單的進度條
7、 sys.stdin.readline() 、sys.getrecursionlimit() 、sys.setrecursionlimit(1200)
sys.stdin.readline()[:-1] 標准輸入
sys.getrecursionlimit() 獲取最大遞歸層數
sys.setrecursionlimit(1200) 設置最大遞歸層數
8、sys.getdefaultencoding() 、sys.getfilesystemencoding
sys.getdefaultencoding() 獲取解釋器默認編碼
sys.getfilesystemencoding 獲取內存數據存到文件里的默認編碼
二、json模塊、pickle模塊
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,Python的Json模塊有序列化與反序列化兩個過程。即 encoding和 decoding。
-
encoding:把一個python對象編碼轉換成Json字符串。
-
decoding:把json格式字符串編碼轉換成python對象。
什么是序列化、反序列化?
我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。
即把python中的對象變成可存儲的json字符串。序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器上。
反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling。
Json模塊提供了四個功能:dumps、dump、loads、load
pickle模塊提供了四個功能:dumps、dump、loads、load
JSON和Python內置的數據類型對應關系
JSON表示的對象就是標准的JavaScript語言的對象,JSON和Python內置的數據類型對應如下:
json和python之間相互轉換
json的4個方法
json提供四個功能:dumps, dump, loads, load
1、dumps和dump
序列化過程
將一個python對象編碼轉換成Json字符串,可以存儲可以網絡遠程傳輸
dumps只完成了序列化為str,將數據通過特殊的形式轉換為所有程序語言都認識的字符串
dump必須傳文件描述符,將序列化的str保存到文件中,將數據通過特殊的形式轉換為所有程序語言都認識的字符串,並寫入文件
dumps()用法
例子
import json dic = {"k1":"v1"} str1= "nicholas" data1 = json.dumps(dic) data2 = json.dumps(str1) print(data1) print(data2) print(type(data1)) print(type(data2))
輸出結果
dump
例子
import json dic = {"k1":"v1"} with open("test.json","a+") as f : json.dump(dic,f)#傳入要序列化的數據、文件描述符
輸出結果
分析:數據通過json.dump轉換為所有程序語言都認識的字符串,並寫入文件
dump等價於dumps加上打開文件然后將data = json.dumps(var) 寫入文件。
例子
import json dic = {"k1":"v1"} data = json.dumps(dic) with open("test.json","a+") as f : f.write(data)
2、loads 和 load
loads 只完成了反序列化,將json編碼的字符串再轉換為python的數據結構
load 只接收文件描述符,完成了讀取文件和反序列化,數據文件中讀取數據,並將json編碼的字符串轉換為python的數據結構
用loads例子
import json with open("test.json") as f : data = json.loads(f.read()) #需要加入f.read()方法讀取文件數據 print(data) print(type(data))
輸出結果
{'k1': 'v1'} <class 'dict'>
用load例子2
import json with open("test.json") as f : data = json.load(f) #直接加入文件描述符即可 print(data) print(type(data))
輸出結果
{'k1': 'v1'} <class 'dict'>
pickle和python之間相互轉換
Pickle的問題和所有其他編程語言特有的序列化問題一樣,就是它只能用於Python,並且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數據,不能成功地反序列化也沒關系。
picle模塊 和json模塊都有 dumps、dump、loads、load四種方法,而且用法一樣。
不用的是json模塊序列化出來的是通用格式,其它編程語言都認識,就是普通的字符串,
而picle模塊序列化出來的只有python可以認識,其他編程語言不認識的,表現為亂碼
注意json的序列化之后產生的格式是還是字符串,pickle序列化之后產生的格式是字節流,可以直接用於網絡傳輸。
例子1
import pickle dic = {"k1":"v1"} with open("test.pickle","wb") as f: #注意這里要用二進制模式,序列化后的對象是'bytes' data = pickle.dumps(dic) f.write(data)
或者
import pickle dic = {"k1":"v1"} with open("test.pickle","wb") as f: data = pickle.dump(dic,f)
例子2
import pickle with open("test.pickle","rb") as f: data = pickle.loads(f.read()) print(data)
或者
import pickle with open("test.pickle","rb") as f: data = pickle.load(f) print(data)
json vs pickle比較:
JSON:
優點:跨語言、體積小
缺點:只能支持int\str\list\tuple\dict
Pickle:
優點:專為python設計,支持python所有的數據類型
缺點:只能在python中使用,存儲數據占空間大
三、shelve 模塊
shelve是封裝了pickle,shelve 只能在python中用
shelve模塊比pickle模塊簡單,只有一個open函數,返回類似字典的對象,可讀可寫;key必須為字符串,而值可以是python所支持的數據類型
序列化:保存對象至shelve文件中
例子
import shelve f = shelve.open("test") names = ["nicholas","jack","pony"] #python中的數據 info = {"age":[18,54,48],"some":[1,2,3]} #python中的數據 f["names"] = ["nicholas","jack","pony"] #向文件中添加內容,添加方式與給字典添加鍵值對類似 f["info"] = {"age":[18,54,48],"some":[1,2,3]} #向文件中添加內容,添加方式與給字典添加鍵值對類似 f.close() #關閉文件
輸出結果
分析:shelve序列化后產生3個文件
反序列化:從文件中讀取對象
例子
import shelve d = shelve.open("test") names = d["names"] # 從文件中類似字典中獲取鍵值的方式一樣讀取內容 info = d["info"] print(names,type(names)) print(info,type(info)) d.close() #關閉文件
輸出結果