序列化与反序列化(Python I/O )---pickle模块与json模块

把变量从内存中变成可存储或传输的过程,称之为序列化(pickling)。
把变量内容从序列化的对象重新读到内存里,称之为反序列化(unpickling)

(1)在序列化期间,对象将其当前状态写入到临时或持久性存储区。其他语言中也被称为serialization,marshalling,flattening等,都是相同的意思。

(2)序列化之后,序列化后的内容(序列化后的内容是一个Bytes)可以写入磁盘,或者通过网络传输到别的机器上。
(4)Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容。如果要让序列化更通用、更符合Web标准,可以使用json模块。
(5)经序列化和反序列化后的对象和原来的变量是完全不相干的,只是内容相同。

pickle模块

1、把一个对象序列化并写入文件,有两种方法:
(1)pickle.dumps( )方法: 把任意对象序列化成一个bytes,可做一些操作,把bytes写入文件。
(2)pickle.dump( )方法: 直接把对象序列化后写入一个file-like Object`在

d=dict(name='shirley',age=23,score=98)
f=open('dump.txt','wb')  
pickle.dump(d,f)
f.close()
f=open("dump.txt",'rb')
print(f.read())

pickle.dumps( )和pickle.dump( )的区别:中间过程是否还需要再做一些操作。(前者是,后者否)

2、同序列化一样,反序列化重新读到内存,有两种方法:

(1)pickle.loads( ):把内容读到一个bytes,用pickle.loads( )方法反序列化出对象

(2)pickle.load( ):直接用pickle.load( )方法从一个file-like Object中反序列化出对象

import pickle
f=open('dump.txt','rb')
s=pickle.load(f)
f.close()

json模块

Python内置的json模块实现从Python对象到JSON格式的转换

(1)JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

(2)JSON是标准格式,比XML更快,而且可以直接在Web页面中读取。

(3)JSON表示的对象就是标准的JavaScript语言的对象

(4)JSON标准规定JSON编码是UTF-8,能正确地在Python的字符串str与JSON的字符串之间转换。

JSON和Python内置的数据类型对应如下:

JSON类型Python类型
{ }dict
[ ]list
1234.56int或float
“string”str
true/falseTrue/False
nullNone

注: 把Python对象转换成JSON格式时,要是上面表格中列举的Python类型,其他类型就会报错。

1、把Python对象变成一个JSON:json.dumps( )方法,json.dump( )方法(后者直接把JSON序列化写入一个file-like Object)

import json
d=dict(name='shirley',age=23,score=98)
print(json.dumps(d))
print(isinstance(json.dumps(d),str)) #判断序列化后的内容类型
print(type(json.dumps(d)))#判断序列化后的内容类型

运行结果:

json.dumps(d){"name": "shirley", "age": 23, "score": 98}
True
<class 'str'>

2、JSON字符串反序列化:json.loads( )方法,json.load( )方法 (前者把JSON的字符串反序列化,后者从file-like Object 中读取字符串并反序列化)

import json
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str))
print(type(json.loads(json_str)))

json进阶

Python的字典dict对象列举的Python类型中,字典dict可以直接序列化为JSON的{ },不过很多时候用class表示对象
1、定义Student类,然后序列化,定制JSON序列化,对可选参数default进行设置,把任意class的实例变为dict,通常类class的实例都有一个__dict__属性,是一个dict,用来存储实例变量。

import json

class Student(object):
    def __init__(self,name,age,score):
        self.name=name
        self.age=age
        self.score=score
s=Student('Nancy',24,89)
print(json.dumps(s, default=lambda obj: obj.__dict__))

2、把JSON反序列化为一个Student对象实例,loads( )方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例

class Student(object):
    def __init__(self,name,age,score):
        self.name=name
        self.age=age
        self.score=score
        
        
import json

def toObject(d):
    return Student(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str))
print(json.loads(json_str, object_hook=toObject))

运行结果:

{'age': 20, 'score': 88, 'name': 'Bob'}
<__main__.Student object at 0x00000000007345C0>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值