序列:列表 元組 字串 bytes.
序列化裡面的序列特指的就是字串和bytes.
把其它的資料型別轉換成字串和bytes的過程就是序列化的過程.
直接序列化的乙個例子:
dic =print([str(dic),dic])#序列化
主要內容
import json'''為什麼要把其它資料型別轉換成字串?
轉字串的過程不就是資料型別的強制轉換嗎?為啥要學json和pickle模組呢?
網路上只能傳輸的是bytes型別.
儲存在檔案裡只是bytes和str(本質是bytes)
最好的傳輸模式:字典->字串->通過網路傳輸->字典->字串
eval要謹慎使用:不可以用在:a.使用者輸入的b.網路上接收的資料c.檔案中的內容
正常人不會用eval作序列化,但已知的**但需要y一些拼接,根據自己的邏輯去做拼接.
所以要有序列化模組
''' dic =
import json
ret = json.dumps(dic)#序列化
print(dic,type(dic))# # print(ret,type(ret))# res = json.loads(ret)
print(res,type(res))#可以直接使用,反序列化
# json.loads()
#問題1
dic1 =
ret1 = json.dumps(dic1)
print(1,json.loads(ret1),type(json.loads(ret1)))#將1和2也變成了字串
#問題2
dic2 =
ret2 = json.dumps(dic2)
print(2,json.loads(ret2),type(json.loads(ret2)))#(4,5,6)變成了[4,5,6]
#問題3
# set3 =
# json.dumps(set3)# is not json serializable
#問題4 #keys must be a string
# json.dumps()#keys must be a string
#json能夠處理的資料型別是非常有限的,只支援字串,列表,字典,數字.json序列化的資料在各種資料中都可以反序列化.因為要和別的語言通訊.
# 字典中的key只能是字串
# 別的語言的例子->前端語言:在網頁上做展示的 但本質上都是資料傳輸
#向檔案當中記錄字典,再從檔案中讀取字典ok.
#問題5
retp = json.dumps(dic)
with open('dic.dump','a',encoding='utf-8') as f:#一般是a而不是a+
# f.write(retp)#可以用json(dic,f)替換
with open('dic.dump','r',encoding='utf-8') as fr:
retr = fr.read()#這裡自己新增的話,必須用雙引號去表示字串,#可以用 dic = json.load(fr)替換
# dict = json.loads(retr)
# print(dic.keys())
#dump load 直接操作檔案,dumps和loads直接操作記憶體(針對資料)
#可以多次將資料dump進檔案,而不能多次load資料(只能load乙個變數),計算機不識別.
#不支援連續的存和取的,這時候只能用dumps和loads來實現這功能
# with open('dic.dump','r') as five_file:
# dic_5 = json.load(five_file)
# dic_5 = json.load(five_file)#報錯
#想要把乙個個的字典放到檔案中再乙個個拿出來怎麼辦?
#解決方法,+分隔符再一行一行的讀取資料,(用dumps和loads來執行)
with open('dic.dump','a') as fa:
dic_dump_write = json.dumps(dic2)
fa.write(dic_dump_write+'\n')
fa.write(dic_dump_write+'\n')
with open('dic.dump', 'r') as fr1:
for line in fr1:
json.loads(line)
json.loads(line)
小結
'''json
dumps loads->針對資料
在記憶體中做資料轉換:
dumps 資料型別轉換成字串 序列化
loads 字串轉成資料型別 反序列化
dump load->針對檔案
直接將資料型別寫入檔案 從檔案中讀出資料列席
json 是所有語言都通用的一種序列化格式
只支援列表,字典,字串,數字
字典的key必須是str
'''
補充
dic_test =print(json.dumps(dic_test,ensure_ascii=false))#不然'無敵'是編碼形式顯示
import json
data =
#格式化序列化
json_dic2 = json.dumps(data,sort_keys=true,indent=2,separators=(',',':'),ensure_ascii=false)#indent縮排數 seperator('換行分割符','key和value分割符'),sort_keys:根據key去排序
print(json_dic2)
'''結果:
'''#一般情況下要存檔案,從網路上傳,都不關心這些格式了.若是格式化容易增加空間開銷.
主要內容
import pickle#支援在python中幾乎所有的資料型別
dic = ,1:'abc'}#json模組無法處理
dic1 = ,2:'abc'}#json模組無法處理
dic2 = ,3:'abc'}#json模組無法處理
ret = pickle.dumps(dic)
print(ret)#bytes型別
#1.pickle dumps的結果永遠是位元組,看不見結果,且無法解碼.
print(pickle.loads(ret))
#2.只有pickle.loads可以認識這些位元組
#3.只能在python中使用
#4.在和檔案操作的時候,要用wb,rb的模式開啟檔案.
#dump load
# with open('pickle_file','wb') as pickle_open:
# pickle.dump(dic,pickle_open)
# pickle.dump(dic1,pickle_open)
# pickle.dump(dic2,pickle_open)
# with open('pickle_file','rb') as pickle_open:
# ret1 = pickle.load(pickle_open)
# print(ret1,type(ret1))#} # ret1 = pickle.load(pickle_open)
# print(ret1,type(ret1))#} #可以多次load,對應上次dump的次數.若是load次數超過dump次數則報錯.
#報錯的解決方法
with open('pickle_file','rb') as pickle_open:
while 1 :
try:
ret1 = pickle.load(pickle_open)
print(ret1,type(ret1))
except eoferror:
break
'''os 和作業系統互動
資料夾和檔案的處理 :建立資料夾 刪除資料夾 重新命名檔案 刪除檔案 listdir stat
路徑的處理 : 路徑的拼接/拆分 計算大小 判斷目錄是否存在/是檔案/是資料夾 絕對路徑相關
執行作業系統命令 : 和執行路徑相關 執行命令的
序列化模組 json/pickle
dump/load 檔案中 <-> 其他資料型別 檔案中 <-> 字串/位元組 <-> 其他資料型別
dumps/loads 字串/位元組 <-> 其他資料型別
json 通用的/支援的資料型別少
pickle python專用的/支援幾乎所有資料型別
'''
環境小碩的轉行之路 15 小作業 閉包 迭代器
前言1.傳入多個數字,求和。2.判斷兩個數字較小的乙個。3.函式 輸入1個可迭代物件,將裡面的元素以 相連拼接成字串。4.寫函式,傳入n個值,返回字典。5.寫函式,輸入n,返回n的階乘。6.寫函式返回乙個撲克牌列表,每一項都是乙個元組,需要用到笛卡爾積。7.列印9 9乘法表。這個曾經自己在小學的時候...
環境小碩的轉行之路 24 大作業 編寫電腦程式
法一 老師的標準答案 import re def atom cal exp 原子性計算 if in exp a,b exp.split return str float a float b 計算乘法 elif in exp a,b exp.split 計算除法 return str float a ...
小碩之路 01
趁導師出差的這段時間,終於有時間來做一些自己的事。從之前的專案中發現了許多自己欠缺的模組。作為乙個專科直接讀研的人,並且還是學的機械相關專業的。對於現在所從事的數位化方向,有很多需要學習的地方。做乙個記錄吧 記錄一下三年的生活,希望自己能堅持 之前的部落格也做的不是很到位。如果發現文章中的問題 希望...