一. python進階(序列化)


一. 序列化

在網絡上都是bytes(字節) 類型

序列化 :--------(Serialization)是指將對象、數據結構的狀態信息轉換為可以存儲或傳輸的形式的過程

反序列化 --------------- 就是 轉換成字符串 可以存儲 我們把變量從內存中變成可存儲或傳輸的過程稱之為序列化,
用於 數據存儲   網絡上傳輸
從數據類型 ---->字符串的過程      序列化
從字符串   -----> 數據類型的過程 反序列化
json
pickle
shelve
json
   通用 的序列化格式
   只有很少的一部分數據據類型 通過json轉化成字符串

pickle
     所有的python中的數據類型都可以轉化成字符串形式
     pickle 序列化的內容只有python 能理解
      且部分反序列化依賴代碼

shelve
     序列化句柄
     使用句柄直接操作 非常方便

1. json dumps 直接對內存中的數據操作(序列化方法     數據類型----->str)

import json
import pickle
# json dumps   序列化方法   數據類型----->str
aa={"name":"張三"}
print(type(aa),aa)            # <class 'dict'> {'name': '張三'}
bb=json.dumps(aa)             # 序列化  dumps  直接對內存中的數據操作
print(type(bb),bb)            # <class 'str'> {"name": "\u5f20\u4e09"}
i=88
A=json.dumps(i)
print(A)          # 88
print(type(A))   # <class 'str'>



s='holle'
D=json.dumps(s)
print(D)      # "holle"       
print(type(D))   # <class 'str'>




K=[11,22]
C=json.dumps(K)
print(C)         # "[11, 22]"
print(type(C))   # <class 'str'>

1. json.loads直接對內存中的數據操作(反序列化   str-----------數據類型)

import json
import pickle
# json dumps 序列化方法   數據類型----->str
aa={"name":"張三"}
print(type(aa),aa)      #  <class 'dict'> {'name': '張三'}
bb=json.dumps(aa)      # 序列化  dumps  直接對內存中的數據操作
print(type(bb),bb)     # <class 'str'> {"name": "\u5f20\u4e09"}


# loads反序列化方法
print("****************")
# str------------數據類型

cc=json.loads(bb)  # 反序列化 loads 直接對內存中的數據操作
print(type(cc),cc)  # <class 'dict'> {'name': '張三'}
import json
# json.loads
# json.loads 用於解碼 JSON 數據。該函數返回 Python 字段的數據類型。
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';


text = json.loads(jsonData)

print(text)          # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
print(type(text))     # <class 'dict'>
數字 字符串 列表 字典 元組(特殊 轉換成字列表)
import  json
import pickle

# 數字  字符串  列表  字典   元組(特殊 轉換成字列表)

ff=(1,2,"哈哈","張三")
print(type(ff))     #  <class 'tuple'>
# pickle.dumps
g=json.dumps(ff)    # 序列化
print(type(g),g)    # <class 'str'> [1, 2, "\u54c8\u54c8", "\u5f20\u4e09"]


print("****************")
r=json.loads(g)     # 反序列化
# pickle.loads
print(type(r),r)    # <class 'list'> [1, 2, '哈哈', '張三']
import json

jsonStr=`{"name":"張三","age":18,
 "hobby":["money","power","english"],"params":{
 "a":1,"b":2}}`



# 將json格式的字符轉換成python數據類型對象
jsonData=json.loads(jsonStr)
print(jsonData)
print(type(jsonData))



# 將python 數據類型的對象轉換成json 格式字符、
jsonDATA2={"name":"張三","age":18}
jsonStr2=json.dumps(jsonDATA2)
print(jsonStr2)

 

 

2.json.dump  是對文件序列化   (序列化方法     數據類型----->str)

import json
import pickle
#        {"age": "\u5f20\u4e09"}# json
#     dump 是對文件序列化           字典  列表 不能直接寫入文件中所有要序列化
st={"age":"張三"}
f=open("a.txt",'w',encoding='utf-8')
# pickle.dump   文件讀取序列化要     寫"wb"   讀"rb"
json.dump(st,f,ensure_ascii=False)        #   dump 是對文件序列化 (寫入) 寫入到文件是bytes類型(字節)  要把tybes字節類型變看的懂的文字 后面加上  ensure_ascii=False
f.close()      

2.json.load是對文件序列化   (反序列化方法    str----> 數據類型)

import  json
import pickle
k=open("a.txt",'r',encoding="utf-8")
# pickle.load
res=json.load(k)      # load 是對文件反序列化 (讀取)
k.close()
print(type(res),res)   # <class 'dict'> {'age': '張三'}

3. pickle模塊
數據持久存儲
pickle模塊實現了基本的數據序列和反序列化
# dumps功能

import pickle
data = ['aa', 'bb', 'cc']  
 # dumps 將數據通過特殊的形式轉換為只有python語言認識的字符串
p_str = pickle.dumps(data)

print(p_str)  
print(type(p_str)) 

# b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.'
# <class 'bytes'>

# loads功能
# loads  將pickle數據轉換為python的數據結構
mes = pickle.loads(p_str)
print(mes)
# ['aa', 'bb', 'cc']


 # dump功能
# dump 將數據通過特殊的形式轉換為只有python語言認識的字符串,並寫入文件
with open('D:\learnPython\py5\b.txt', 'w') as f:
        pickle.dump(data, f)

 # load功能
 # load 從數據文件中讀取數據,並轉換為python的數據結構

with open('D:\learnPython\py5\b.txt', 'r') as f:
      data = pickle.load(f) 


 # dumps功能
import pickle
data = ['aa', 'bb', 'cc']  
# dumps 將數據通過特殊的形式轉換為只有python語言認識的字符串
p_str = pickle.dumps(data)
print(p_str)            
b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.

# loads功能
# loads  將pickle數據轉換為python的數據結構
mes = pickle.loads(p_str)
print(mes)
['aa', 'bb', 'cc']



 # dump功能
 # dump 將數據通過特殊的形式轉換為只有python語言認識的字符串,並寫入文件
 with open('D:/tmp.pk', 'w') as f:
   pickle.dump(data, f)



# load功能
# load 從數據文件中讀取數據,並轉換為python的數據結構
with open('D:/tmp.pk', 'r') as f:
    data = pickle.load(f)
import json
import pickle

#使用pickle模塊將數據對象保存到文件

# 將文本文件轉化為二進制文件

with open('aa.txt')as src,open('bb.txt','wb')as dest:
    lines=src.readline()
    pickle.dump(len(lines),dest)
    for line in lines:
        pickle.dump(line,dest)


with open('bb.txt','rb')as fp:
    n=pickle.load(fp)
    for i in range(n):
        print(pickle.load(fp))

# pickle.dump(obj, file[, protocol])
#   序列化對象,並將結果數據流寫入到文件對象中。參數protocol是序列化模式,默認值為0,表示以文本的
# 形式序列化。protocol的值還可以是1或2,表示二進制的形式序列化。
#使用pickle模塊從文件中重構python對象
# pickle.dump   文件讀取序列化要     寫"wb"   讀"rb"
import pprint
#使用pickle模塊將數據對象保存到文件   數據類型------------->字符串
import pickle
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
aa=selfref_list.append(selfref_list)
print(aa)
output = open('bb.txt', 'wb')
pickle.dump(data1, output)
bb=pickle.dump(selfref_list, output, -1)
print(type(bb))
output.close()



#使用pickle模塊從文件中重構python對象  反序列化  str----------->數據類型
pkl_file = open('bb.txt', 'rb')
data1 = pickle.load(pkl_file)
pprint.pprint(data1)
data2 = pickle.load(pkl_file)
pprint.pprint(data2)
pkl_file.close()


# pickle.dump(obj, file, [,protocol])
#   注解:將對象obj保存到文件file中去。
#      protocol為序列化使用的協議版本,0:ASCII協議,所序列化的對象使用可打印的ASCII碼表示;1:老式的二進制協議;2:2.3版本引入的新二進制協議,較以前的更高效。其中協議0和1兼容老版本的python。protocol默認值為0。
#      file:對象保存到的類文件對象。file必須有write()接口, file可以是一個以'w'方式打開的文件或者一個StringIO對象或者其他任何實現write()接口的對象。如果protocol>=1,文件對象需要是二進制模式打開的。
#
#   pickle.load(file)
#   注解:從file中讀取一個字符串,並將它重構為原來的python對象。
#   file:類文件對象,有read()和readline()接口。

 

4. 序列化案例

import json
li=[{"name":"張三"},{"age":"25"},{"sex":""}]
f=open("b.txt","w",encoding="utf-8")
for i in li:
    str_dic=json.dumps(i)
    f.write(str_dic+'\n')
f.close()

"""
注意寫入b.txt文件中數據內容
{"name": "\u5f20\u4e09"}
{"age": "25"}
{"sex": "\u7537"}

"""


ff=open("b.txt","r",encoding="utf-8")
dice=[]
for ii in ff:
    dec=json.loads(ii.strip())
    # print(dec)
    dice.append(dec)
ff.close()
print(dice)  # [{'name': '張三'}, {'age': '25'}, {'sex': '男'}]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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