1. 程式人生 > >Python3學習之路~5.7 Json & pickle 模塊

Python3學習之路~5.7 Json & pickle 模塊

spa enc ide 單引號 之路 raw_input 轉換 list gif

用於序列化的兩個模塊

  • json,用於字符串 和 python數據類型間進行轉換
  • pickle,用於python特有的類型 和 python的數據類型間進行轉換

Json模塊提供了四個功能:dumps、dump、loads、load

pickle模塊提供了四個功能:dumps、dump、loads、load

json.dumps 將數據通過特殊的形式轉換為所有程序語言都認識的字符串

json.dump 將數據通過特殊的形式轉換為所有程序語言都認識的字符串,並寫入文件

pickle.dumps 將數據通過特殊的形式轉換為只有Python語言認識的字符串

pickle.dump 將數據通過特殊的形式轉換為只有Python語言認識的字符串,並寫入文件

Json序列化舉例:

技術分享圖片
# json是所有語言中都通用的,適用於不同語言進行數據交互。
# 但json只能處理簡單的數據類型,如果要處理復雜的,可以使用pickle
# 應用場景舉例:當你使用虛擬機(或者玩遊戲)時,中間你突然有點別的事情,於是要將虛擬機掛起,以便下次使用時還是現在的狀態。
# 於是就用到了json,json序列化將虛擬機目前的狀態(比如進行了什麽操作,打開了什麽文件)保存在文件中,
# 當你幹完別的事,再次啟動虛擬機時,json反序列化會將文件中保存的狀態從文件中讀出來,於是你就可以繼續上次的操作了。

# dump和load配合使用可以實現序列化和反序列化,
# 在Python2中可以dump很多次,也可以load很多次,他們一一對應,但是其實這沒什麽意義 # 但在Python3中,可以dump很多次,但是當dump多次時,load會報錯,所以記住在Python3中永遠不要dump多次 import json info = { "name":"Alex", "age":22 } with open(text.txt,w,encoding=utf-8) as f: #f.write(info) #報錯,字典不能寫入文件中,字符串能寫入文件中 #f.write(str(info)) #太low了 print
(type(json.dumps(info))) # <class ‘str‘> #f.write( json.dumps(info) ) # 高級做法1 json.dump(info,f) # 高級做法2,同上
json序列化.py 技術分享圖片
import json
with open(text.txt,r,encoding=utf8) as f:
    #data=json.loads(f.read())
    data=json.load(f) #同上
    print(data["age"])
json反序列化.py

pickle序列化舉例:

技術分享圖片
# pickle寫進文件中的貌似是一段亂碼,其實不然,這是pickle自己的一套語法規則,當然這也不是加密
# pickle可以序列化所有的數據類型
# 但是pickle只能在Python中使用,別的語言不認識它

import pickle
def sayhi(name):
    print("Hello ",name)

info = { "name":"Alex", "age":22, func:sayhi }

with open(text2.txt,wb) as f:
    print(type(pickle.dumps(info)))  # <class ‘bytes‘>
    f.write( pickle.dumps(info) ) # sayhi是一個內存地址,用json序列化就寫不到文件中,會報錯
pickle序列化.py 技術分享圖片
import pickle
# def sayhi(name):
#     print("Hello2 ",name)

with open(text2.txt,rb) as f:
    data=pickle.loads(f.read()) # 報錯
    print(data)
    # data["func"](‘alex‘)
# AttributeError: Can‘t get attribute ‘sayhi‘ on <module ‘__main__‘ from ‘D:/python-study/s14/Day04/pickle反序列化.py‘>
# 為什麽報錯呢?因為sayhi是一個內存地址,當pickle序列化.py程序執行完之後,這個地址就被釋放了,當然我們就找不到了。
# 這裏只是想說明一點:pickle可以序列化所有的數據類型,不管這個數據是否可被反序列化
# 如果想要不報錯,可以把sayhi函數的定義拷貝過來,而且還可以執行這個函數
# 只要保證函數名相同就不會報錯,函數體可以完全不一樣
pickle反序列化.py

json模塊的作用之一:根據字符串書寫格式,將字符串自動轉換成相應格式

技術分享圖片
import json

# Python3.x中input方法獲取到的都是字符串,相當於Python2.x中的raw_input
inp_str = input("請輸入:") # 輸入一個列表,[1,2,3]
print(type(inp_str)) # <class ‘str‘>
inp_str = json.loads(inp_str,encoding="UTF-8") # 根據字符串書寫格式,將字符串自動轉換成 列表類型
print(type(inp_str),inp_str[0]) # <class ‘list‘> 1

inp_str = input("請輸入:") # 輸入一個字典,{"name":"Rose","age":21,"sex":"F"}
                             # 切記,字典內部必須是 雙引號 !!!單引號會報錯。
print(type(inp_str)) # <class ‘str‘>
inp_str = json.loads(inp_str,encoding="UTF-8") # 根據字符串書寫格式,將字符串自動轉換成 字典類型
print(type(inp_str),inp_str[name],inp_str[age],inp_str[sex]) # <class ‘dict‘> Rose 21 F
View Code

Python3學習之路~5.7 Json & pickle 模塊