Python之路(第十五篇)sys模塊、json模塊、pickle模塊、shelve模塊


 

一、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模塊有序列化與反序列化兩個過程。即 encodingdecoding。

  • 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()  #關閉文件

  

輸出結果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM