Python序列化與持久化

2021-09-28 18:21:49 字數 3919 閱讀 8782

資料持久化可以將資料儲存到檔案中,資料庫中。儲存到檔案中可以是普通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...