在程序运行的过程中,所有的变量都是在内存中,比如定义一个dict1 = {“name”:“zhangsan”,“age”:20},我们对name属性进行修改,改"wangwu",但是一旦程序结束,变量所占用的内存就会被操作系统全部回收,如果没有把修改后的name存储到磁盘上,下次重新运行程序,属性name又会被初始化为"zhangsan"。

这时候就会使用到序列化与反序列化,将序列化后的内容写入磁盘,这里会讲到pickle模块与json模块去实现序列化与反序列化。

序列化与反序列化

在Python中,我们将变量从内存中变成可存储或者是可传输的这个过程我们称之为序列化,即pickling

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling

例如:将字典存到demo.txt文件中,再从demo.txt文件中将字典重新读取出来

首先实现将字典存到文件中,代码如下:

def

writeFile

(

dict1

)

:

with

open

(

"demo.txt"

,

"w"

,

encoding

=

"utf-8"

)

as

f

:

f

.

write

(

str

(

dict1

)

)

将字典从文件重新读取出来,代码如下:

def

readFile

(

)

:

with

open

(

"demo.txt"

,

"r"

,

encoding

=

"utf-8"

)

as

f

:

return

eval

(

f

.

read

(

)

)

再调用writeFile函数和readFile函数就可以实现字典从文件读取与存入:

if

__name__

==

'__main__'

:

dict1

=

{

"name"

:

"韩梅梅"

,

"age"

:

19

}

writeFile

(

dict1

)

dict2

=

readFile

(

)

print

(

dict2

)

pickle模块

pickle模块可以将任意的对象序列化成二进制的字符串写入到文件中。还可以从文件中读取并且转为写入时候类型。

现有如下这样一个Card类,我们想要将由Card对象组成的列表存到文件中,并且从文件中将其读取出来,该怎样去实现呢?

class

Card

:

def

__init__

(

self

,

cardnum

,

password

,

money

,

lock

=

False

)

:

self

.

cardnum

=

cardnum

self

.

password

=

password

self

.

money

=

money

self

.

lock

=

lock

这里我们可以用pickle模块去实现对象的序列化以及反序列化,下面将会讲到pickle模块中会用到的几个函数

要使用到pickle模块,我们就要先导入pickle模块

import

pickle

1. pickle.dumps(obj)和pickle.dump(obj,file)

pickle.dumps(obj)函数的功能是将obj对象进行序列化

def

writeFile

(

path

,

cardlist

)

:

with

open

(

path

,

"wb"

)

as

f

:

f

.

write

(

pickle

.

dumps

(

cardlist

)

)

pickle.dump(obj,file)函数的功能是将obj对象序列化并且存入到打开的文件中

def

writeFile

(

path

,

cardlist

)

:

with

open

(

path

,

"wb"

)

as

f

:

pickle

.

dump

(

cardlist

,

f

)

2. pickle.loads(bytes)和pickle.load(file)

pickle.loads(bytes)函数的功能是将二进制的字符串转为对象

def

readFile

(

path

)

:

with

open

(

path

,

"rb"

)

as

f

:

return

pickle

.

loads

(

f

.

read

(

)

)

pickle.load(file)函数的功能是将文件中的内容读取并且转为对象

def

readFile

(

path

)

:

with

open

(

path

,

"rb"

)

as

f

:

return

pickle

.

load

(

f

)

在上面我们已经完成了列表的文件存取函数,现在只要调用writeFile函数和readFile函数就可以了

if

__name__

==

'__main__'

:

card1

=

Card

(

"101111"

,

"111"

,

100

)

card2

=

Card

(

"101112"

,

"222"

,

1000

)

card3

=

Card

(

"101113"

,

"333"

,

10000

)

cardlist

=

[

card1

,

card2

,

card3

]

path

=

"pickledemo.txt"

writeFile

(

path

,

cardlist

)

cardlist1

=

readFile

(

path

)

for

card

in

cardlist1

:

print

(

"cardnum: %s\npassword: %s\nmoney: %d"

%

(

card

.

cardnum

,

card

.

password

,

card

.

money

)

)

json模块

json模块提供的方法,可以直接将python基本数据类型序列化为json字符串。也可以将json字符串转为python的基本数据类型。

还是以上面的例子为例,现在要将有Card对象组成的字典存到文件中,并且从文件中将其读取出来

要使用到json模块,也要先导入json模块

import

json

1. json.dumps(obj,default)

obj:被序列化的对象

default:将对象转为字典的函数

功能:将对象序列化为json字符串

首先我们需要一个可以将Card对象转化为字典的函数,将其传递到default参数中

def

obj2dict

(

card

)

:

return

{

"cardnum"

:

card

.

cardnum

,

"password"

:

card

.

password

,

"money"

:

card

.

money

,

"lock"

:

card

.

lock

}

将字典存到文件中

def

writeFile

(

path

,

carddict

)

:

with

open

(

path

,

"w"

,

encoding

=

"utf-8"

)

as

fp

:

for

card

in

carddict

.

values

(

)

:

jstr

=

json

.

dumps

(

card

,

default

=

obj2dict

)

fp

.

write

(

jstr

+

'\n'

)

2. json.dump(obj,file,default)

obj:被序列化的对象

file:打开的文件对象

default:将对象转为字典的函数

功能:将对象序列化为json字符串并且写入到打开的文件对象中

def

writeFile

(

path

,

carddict

)

:

with

open

(

path

,

"w"

,

encoding

=

"utf-8"

)

as

fp

:

json

.

dump

(

carddict

,

fp

,

default

=

obj2dict

)

3. json.loads(jsonstr,object_hook)

jsonstr:json字符串

object_hook:将字典转为对象的函数

功能:将字符串反序列化成对象

这里需要一个可以将字典转化为Card对象的函数,将其传递到object_hook参数中

def

dict2obj

(

dict1

)

:

return

Card

(

dict1

[

"cardnum"

]

,

dict1

[

"password"

]

,

dict1

[

"money"

]

,

dict1

[

"lock"

]

)

从文件中读取数据

def

readFile

(

path

)

:

with

open

(

path

,

"r"

,

encoding

=

"utf-8"

)

as

fp

:

carddict

=

{

}

for

jstr

in

fp

.

readlines

(

)

:

card

=

json

.

loads

(

jstr

,

object_hook

=

dict2obj

)

carddict

[

card

.

cardnum

]

=

card

return

carddict

4. json.load(fp,object_hook)

fp:打开的文件对象

object_hook:将字典转为对象的函数

功能:将打开的文件对象的内容读取并且反序列化成对象

def

readFile

(

path

)

:

with

open

(

path

,

"r"

,

encoding

=

"utf-8"

)

as

fp

:

carddict

=

json

.

load

(

fp

)

return

carddict

最后只要调用writeFile函数和readFile函数就可以实现对象字典的文件存取

python中的序列化与反序列化_Python之序列化与反序列化(pickle模块与json模块)...相关推荐

  1. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  2. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

  3. python中异或怎么算_python 异或运算的前提_异或运算公式

    Python基础(10)–数字-Python-第七城市 609x288 - 73KB - JPEG Python基础(10)--数字_资讯_突袭网 609x288 - 33KB - JPEG pyth ...

  4. python写一个很简单的Atm机系统,使用pickle模块和json模块来保存数据

    我做的是一个很简单的Atm系统,很多都没约束条件 目的: 用面向对象思维来处理 运用文件的读写 文件的读写用pickle模块和json模块来处理 pickle模块: pickle模块处理数据功能很强大 ...

  5. python中的array函数作用_Python中的Array | 数组2(简介和功能)

    相关文章:Python中的数组Array | 1(简介和功能) 以下是更多函数. 1. typecode:此函数返回初始化数组所用的数据类型. 2. itemsize:此函数返回单个数组元素的大小(以 ...

  6. python中left是什么意思_Python left

    最新项目 摘要 Django模板加载器,如果激活的语言是从右到左的语言(如阿拉伯语或希伯来语),则该加载器将查找模板文件的从右到左的替代版本. 这提供了一种简单明了的方法来定制模板中的标记,而无需在模 ...

  7. python中dumps是什么意思_python中的dumps和loads区别

    一.概念理解 json是一种轻量级的数据交换格式,对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如: {"name":"cc ...

  8. python中 r是什么意思_python中r含义

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 另外encoding可以指定解码格式,utf-8是现在的主流编码方式,如果没有指 ...

  9. python中isnumeric函数怎么用_Python中isnumeric()方法的使用简介

    Python中isnumeric()方法的使用简介 isnumeric()方法检查字符串是否仅由数字组成.这种方法只表示为Unicode对象. 注意:要定义一个字符串为Unicode,只需前缀分配'u ...

  10. python中get和set使用_Python对象属性的set和get方法

    属性的set和get方法 如果有一个对象,当需要对其进行修改属性时,有2种方法: 1.对象名.属性名 = 数据 -->直接修改 2.对象名.方法名() -->间接修改 为了更好的保存属性安 ...

最新文章

  1. 西北工业大学21计算机考研,西北工业大学2018年计算机考研879专业综合考试大纲...
  2. 自动化测试现状趋势解读,附带近年自动化测试常用工具
  3. git pull问题“error: Your local changes to the following files would be overwritten by merge”解决方案
  4. 两个排序数组合并第k或前k个最小值问题
  5. 操作系统课设--系统调用
  6. Ubuntu Server 16.04 LTS上使用Docker部署Tomcat
  7. Unity3D的一些坑
  8. linux将所有文件生成lst_Linux自定义repo文件
  9. OpenShift 4 - 使用定制的Grafana和Dashboard
  10. spring-boot-maven-plugin 爆红,分析原因并解决。
  11. 中国雅虎首页改版彻底与口碑网剥离
  12. 戴戒指的含义(以后要结婚的必看)
  13. 【父亲节H5】用独特的方式表达最深沉的爱!
  14. xyz坐标转换ybc_经纬度转换XYZ
  15. Unity3D 《拥挤城市》3D房子建筑透视效果实
  16. 首旅如家:夜间赏樱、采茶旅拍和登高许愿成为2021打开春天的新方式
  17. java 输出乘法口诀第一列_java输出乘法口诀表
  18. CSR8670学习笔记:OTA升级固件
  19. 对于“卡片复用”引来的一场尴尬。。。
  20. 2014北邮计算机考研复试上机题解(上午+下午)

热门文章

  1. 深入分析redis之rax底层原理,前缀树?
  2. Java实现自动发送电子邮件 发送邮件验证码(附全部源码)
  3. 手机企业邮箱客户端哪个好用?
  4. IntelliJ Idea设置护眼浅绿色背景方法
  5. 兜兜转转还是回到程序员圈子
  6. spring jpa Specification in 查询
  7. linux实用教程复习题,linux上机复习题(部分答案)
  8. C++ 移动语义学习
  9. 亚马逊自然语言NLP 商品评论智能分析 demo及开发过程 【1 总体API介绍】【持续更新中】
  10. 惠普电脑u盘重装系统步骤_惠普笔记本u盘系统安装步骤 惠普u盘启动系统安装...