資料持久化可以將資料儲存到檔案中,資料庫中。儲存到檔案中可以是普通txt檔案,csv檔案等,資料庫可以是sql資料庫mongodb資料庫等
變數從記憶體中變成可儲存或傳輸的過程稱之為序列化,在python中叫pickling
變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化,即unpickling
json.load()從檔案中讀取json字串,轉換為字典型別
json.loads()將json字串轉換為字典型別
json.dumps()將python中的字典型別轉換為字串型別
json.dump()將json格式字串寫到檔案中
json序列化方法:
dump 和 dumps 都實現了序列化load 和 loads 都實現反序列化dump與load針對檔案物件,分別寫入和讀取檔案,dumps和loads針對記憶體物件
#!usr/bin/python
# -*- coding: utf-8 -*-
import json
adict =
#序列化
a = json.dumps(adict)
print(a)
#''返回結果是json字串
e = json.dump(adict,open("data1.json","w"))
print(e,type(e))
#none 沒有返回值,將python字典型別寫入到data1.json檔案中,轉換為json檔案格式,data1.json內容
##反序列化
json_str = ''
b = json.loads(json_str)
print(b)
#返回結果是python字典格式的資料
f = open("data.json","r")
c = json.load(f)
print(c,type(c))
# 返回結果是字典型別,從檔案中讀取成python字典型別
非python基本資料型別的物件進行序列化與反序列化
#實現非基本型別物件的序列化與反序列化
#序列化方法1.給default方法引數2.先將物件轉換為字典obj.__dict__方法3.類中新增to_json方法,方法1,2,3本質一樣
class student:
def __init__(self, name, age, male):
self.name = name
self.age = age
self.male = male
s = student("lili",20,false)
#由於s不是pyton基本型別物件,所以如果直接json.dumps(s)會報錯typeerror: <_io.bytesio object at> is not json serializable
#需要指明轉換方法
print(s.__dict__)#
h= json.dumps(s.__dict__)
print(h) #''
g = json.dumps(s,default=lambda obj:obj.__dict__)
print(g) #''
class student2:
def __init__(self, name, age, male):
self.name = name
self.age = age
self.male = male
def to_json(self):
#default引數指定轉換方式,sort_keys是否對key進行排序,indent格式的空格數
return json.dumps(self, default=lambda o: o.__dict__,
sort_keys=false, indent=2)
s = student2("lili",20,false)
i = s.to_json()
print(i)
序列化模組pickle,用法跟json類似
首先匯入模組import pickle
序列化:
pickle.dump(序列化物件,檔案物件)
pickle.dumps(序列化物件),返回值是乙個字串,需要手動將這個字串寫入到檔案中
複製**
import pickle
info=
f=open("test2.txt","wb")
pickle.dump(info,f)#序列化方法1
# f.write(pickle.dumps(info))#序列化方法2
f.close()
複製**
反序列化:
pickle.load(檔案物件)
pickle.loads(字串)
複製**
print("------反序列化--------")
import pickle
f=open("test2.txt","rb")
data=pickle.loads(f.read())#反序列方法1
print(data)
# data=pickle.load(f)#反序列方法2
# print(data)
f.close()
shelve使用方法,類似字典
import shelve,time
d = shelve.open('shelvetest') # 開啟乙個檔案
print("----------寫----------")
info =
name = ["autuman", "zhangsan", "lisi"]
d["teacher"] = name
d["student"] = info
d["date"] = time.ctime()
print("--------讀------------")
print(d.get("teacher"))
print(d.get("student"))
print(d.get("date"))
d.close()
自定義物件讀寫
import shelve,time
class a:
def hello(self):
print("123")
d = shelve.open('shelve_test') # 開啟乙個檔案
print("----------寫----------")
d['class'] =a
print("--------讀------------")
dbm讀寫,也會生成如上的三個型別的檔案
dbm與shelve非常類似,但dbm的鍵和值必須是字串型別
dbm預設寫入的資料是bytes的,將所有字串都序列化成bytes的
import dbm
db=dbm.open("test.txt","c")
print("寫".center(50,'-'))
db["name"]="1111111111112"
db["name2"]="2222222222222"
print("讀".center(50,'-'))
print(db["name"])
print(db["name2"])
db.close()
python 序列化與資料持久化
資料持久化的方式有 1.普通檔案無格式寫入 將資料直接寫入到檔案中 2.普通序列化寫入 json,pickle 3.dbm方式 shelve,dbm 反序列化 print json序列化 import json import time info info2 1 2,3,4 f open test.t...
Python序列化與反序列化
序列化 將python裡的基本型別如字典 列表 陣列等序列化為字串 反序列化 將字串反序列化為python裡的基本型別如字典 列表等 常用 json r requests.get 杭州 r.encoding utf 8 print r.text print dic json.loads r.text...
ejb 持久化序列化物件
從客戶端 將使用者物件新增到 ejb 伺服器上 user 物件需要序列化 實現 serializable介面 public class user implements serializable public void setid int id public string getname public...