我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 序列化模块(json,pi

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 序列化模块(json,pi

json模块

JSON (JavaScript Object Notation):是一个轻量级的数据交换格式模块,受javascript对象文本语法启发,但不属于JavaScript的子集。

常用方法:

dump(obj,fp):将对象以字符串的形式写入文件中。

load(fp):将数据从文件中读出,并返回(需要变量接收)数据的原类型。

dumps(obj):将对象转换成json字符串形式。

loads(str):将json字符串数据转换成原来的数据类型。

实例如下:dumps(obj) | loads(str)

import json

dict_1 = {"电影":"黄飞鸿","电视剧":"霍元甲"}

json_str = json.dumps(dict_1)  # 将字典转换成json的字符串类型

dict_2 = json.loads(json_str)  # 将json的字符串类型转换成原数据

print(json_str,type(json_str))

print(dict_2.items(),type(dict_2))

# 打印内容如下
{"\u7535\u5f71": "\u9ec4\u98de\u9e3f", "\u7535\u89c6\u5267": "\u970d\u5143\u7532"} <class 'str'>
dict_items([('电影', '黄飞鸿'), ('电视剧', '霍元甲')]) <class 'dict'>

实例如下:dump(obj,fp) | load(fp)

import json
# 向文件中写入json数据

dict_1 = {"电影":"黄飞鸿","电视剧":"霍元甲"}

file_write = open("json.txt",mode="w",encoding="utf-8")

json.dump(dict_1,file_write)  # 将字典以json的字符串类型写入文件

file_write.close()
# 从文件中读取json数据

file_read = open("json.txt",mode="r",encoding="utf-8")

dict_2 = json.load(file_read) # 将文件中内容转换成原数据类型并返回

file_read.close()

print(dict_2.items(),type(dict_2)) # 打印转换后的数据

# 打印内容如下
dict_items([('电影', '黄飞鸿'), ('电视剧', '霍元甲')]) <class 'dict'>

这里需要注意的是json模块dump(obj,fp)虽然可以多次上传,但是在load时会报错,load(fp)函数不能转换多次dump的数据。所以如果想要向json文件中新增数据时,需要将数据load下来转换成原数据,然后在原数据基础上进行新增。最后将处理后的数据dump覆盖写到文件中。

pickle模块:

属于python专有的模块,用法,功能与json类似。

常用方法:

dump(obj,fp):将对象以字符串的形式写入文件中。

load(fp):将数据从文件中读出,并返回(需要变量接收)。

dumps(obj):将对象转换成json字符串形式。

loads(str):将json字符串数据转换成原来的数据类型。

dump(obj,fp)  |  load(fp) 示例如下;

import pickle
# 将数据以json方式写入文件

dict_1 = {"电影":"黄飞鸿","电视剧":"霍元甲"}

file_write = open("pickle.txt",mode="wb")

pickle.dump(dict_1,file_write)  # 将字典以字节的形式写入文件

file_write.close()
# 从文件中以json方式读取数据

file_read = open("pickle.txt",mode="rb")

dict_2 = pickle.load(file_read)  # 将文件中内容转换成原数据类型并返回

file_read.close()

print(dict_2.items(),type(dict_2)) # 打印转换后的数据

# 打印内容如下
dict_items([('电影', '黄飞鸿'), ('电视剧', '霍元甲')]) <class 'dict'>

dumps(obj)  |  loads(obj) 示例如下;

import pickle

dict_1 = {"电影":"黄飞鸿"}

pickle_byte = pickle.dumps(dict_1)  # 将字典转换成pickle字节

print(pickle_byte)

# 将pickle字节转换成原数据

dict_2 = pickle.loads(pickle_byte)

print(dict_2.items(),type(dict_2)) # 打印转换后的数据
# 打印内容如下
b'\x80\x03}q\x00X\x06\x00\x00\x00\xe7\x94\xb5\xe5\xbd\xb1q\x01X\t\x00\x00\x00\xe9\xbb\x84\xe9\xa3\x9e\xe9\xb8\xbfq\x02s.'
dict_items([('电影', '黄飞鸿')]) <class 'dict'>

与json不同的是pickle可以多次dump多次load,如下:

import pickle

dict_1 = {"电影":"黄飞鸿"}

dict_3 = {"电视剧":"霍元甲"}

dict_5 = {"动画片":"葫芦娃"}

file_write = open("pickle.txt",mode="wb")

pickle.dump(dict_1,file_write)  # 将dict_1以字节的形式写入文件

pickle.dump(dict_3,file_write)  # 将dict_3以字节的形式写入文件

pickle.dump(dict_5,file_write)  # 将dict_5以字节的形式写入文件

file_write.close()

file_read = open("pickle.txt",mode="rb")

dict_2 = pickle.load(file_read)  # 将文件中内容转换成原数据类型并返回

dict_4 = pickle.load(file_read)  # 将文件中内容转换成原数据类型并返回

dict_6 = pickle.load(file_read)  # 将文件中内容转换成原数据类型并返回

file_read.close()

print(dict_2.items(),type(dict_2)) # 打印转换后的数据

print(dict_4.items(),type(dict_4)) # 打印转换后的数据

print(dict_6.items(),type(dict_4)) # 打印转换后的数据
# 打印内容如下
dict_items([('电影', '黄飞鸿')]) <class 'dict'>
dict_items([('电视剧', '霍元甲')]) <class 'dict'>
dict_items([('动画片', '葫芦娃')]) <class 'dict'>

小结:

1、json属于通用的模块,Java,JS等其它语言也支持。

     pickle是Python私有的,只支持Python。

2、json将对象转换成json字符串类型。

     pickle将对象转换成pickle字节类型。

3、json只能转换dict,list,tuple,str,int,float,bool值等简单数据类型

     pickle能转换除了lamda以外的所有已知数据类型。

4、json虽然可以多次dump但是load会报错(这是最大的伤)。

     pickle可以多次dump,多次load。

shelve模块

使用json或者pickle持久化数据,能dump多次,但load的话只能取到最新的dump, 因为先前的数据已经被后面dump的数据覆盖掉了。如果想要实现dump多次不被覆盖,就可以想到使用shelve模块。shelve模块可以持久化所有pickle所支持的数据类型。另外,写程序的时候如果不想用关系数据库那种重量级的去存储数据,也可以用到shelve。

shelve是用key来访问的,使用起来和字典类似。 要注意的是,在shelve模块中,key必须为字符串,而值可以是python所支持的数据类型。

另外,shelve其实用anydbm去创建DB并且管理持久化对象的。

shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。 可以像字典一样使用get来获取数据等。

如下操作:

import shelve

f_shelve = shelve.open('shelve') # 创建一个文件句柄

f_shelve["name"] = "小明" # 向文件中存放数据

f_shelve["age"] = 21 # 向文件中存放数据

f_shelve["sex"] = "男"

运行后会生成3个文件:shelve.bak shelve.dat shelve.dir

shelve.dat 存储的就是b字节数据类型的数据。bak和dir后缀从字面上看是备份和目录,具体做什么的不是很清楚。

当我们写好数据后,如何读取呢?

import shelve

f_shelve = shelve.open('shelve') # 创建一个文件句柄

# 打印文件内容,和类型

print(f_shelve["name"],f_shelve["age"],f_shelve["sex"],type(f_shelve))

# 打印内容如下
小明 21 男 <class 'shelve.DbfilenameShelf'>

既然f_shelve类似于字典,那我们也可以使用for循环进行打印,如下:

import shelve

f_shelve = shelve.open('shelve') # 创建一个文件句柄

# 使用for循环打印内容

for k,v in f_shelve.items():

    print(k,v)

# 打印内容如下
name 小明
age 21
sex 男

f_shelve现在是一个特殊的文件句柄,它可以执行字典的多数方法,对文件里的数据进行操作。

import shelve

f_shelve = shelve.open('shelve') # 创建一个文件句柄

f_shelve["list"] = [1,2,3]  # 向文件中添加数据列表

f_shelve["list"].append("abc") # 向列表中追加内容.

f_shelve["list"].pop(1) # 从列表中删除一个元素



f_shelve["name"] = "小明" # 向文件中追加内容

f_shelve["name"] = "小红" # 修改name所对应的值

print(f_shelve["list"],f_shelve["name"],sep="\n")

# 打印内容如下
[1, 2, 3]
小红

通过上面的打印内容我们可以发现,我们将列表写入文件后,然后在读取出来进行追加和删除元素,并没有对文件产生影响,文件中的列表内容还是原来的值。而我们向文件中添加字符串时,在读取出来对字符串进行修改发现数据被修改了。

由此我们可以知道在向文件中写入一个可变的数据时,如果读取出来对数据进行修改只是在内存中的修改,修改后的数据并没有被真正写入到文件中。那么我们该如何进行操作呢?这时就需要回写了。

import shelve

# 创建一个特殊的文件句柄,并添加回写功能

f_shelve = shelve.open('shelve',writeback=True)  # 启用会写

f_shelve["list"] = [1,2,3]  # 向文件中添加数据列表

f_shelve["list"].append("abc") # 向列表中追加内容.

f_shelve["list"].pop(1) # 从列表中删除一个元素

print(f_shelve["list"])

# 打印内容如下
[1, 3, 'abc']

这回我们在修改列表时,可以看出列表的数据确实被修改了。

总结如下:

1、shelve模块将内存数据以字典的类型(key,value)通过文件持久化,模拟出简单的db效果。

2、shelve模块可以持久化任何pickle所支持的python数据格式,但是它的key必需得是字符串。

3、shelve可以看作是pickle模块的一个封装,但它实现了可以多次dump(后面的dump不会覆盖前面的)和多次load。

4、shelve访问己有key时,实际上取出的是数据源给出的一份拷贝,所以对于拷贝做出的增加和删除等操作都需要用writeback=True参数才能实现写入回文件中进行修改。

5、shelve对于d[key] = data这种操作,视为存储数据,无则新增,有则覆盖,

对与访问key当中的值(条目)进行修改,默认不回写并不矛盾和冲突。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 序列化模块(json,pi

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python 序列化模块(json,pi

json模块JSON (JavaScript Object Notation):是一个轻量级的数据交换格式模块,受javascript对象文本语法启发,但不属于JavaScript的子集。常用方法:dump(obj,fp):将对象以字符串的
2023-01-30

Python学习笔记:json模块和pi

Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提供的方法也是一样的:dumps,dump,loads,loaddumps(obj):将对象序列化为str。dump(obj, fp):将对象序列化为str,并存
2023-01-30

Python序列化模块之pickle与json怎么使用

本篇内容主要讲解“Python序列化模块之pickle与json怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python序列化模块之pickle与json怎么使用”吧!序列化模块imp
2023-06-30

Python开发之序列化与反序列化:pi

在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在。另一方面,存储在内存够中的对象由于编程语言、网络环境等等因素,很难在网络中进行传输交互。由此,
2023-01-30

Python json序列化

Python内置的json模块提供了非常完善的对象到JSON格式的转换。废话不多说,我们先看看如何把Python对象变成一个JSON:d = dict(name='Kaven', age=17, sex='Male')print(json.
2023-01-31

python3--序列化模块,hashlib模块

内置方法(回顾)__len__ len(obj)的结果依赖于obj.__len__()的结果,计算对象的长度__hash__ hash(obj)的结果依赖于obj.__hash__()的结果,计算对象的hash值__eq__ obj
2023-01-30

python序列化:json,pickl

什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等。程
2023-01-31

Python的pickle序列化和JSON序列化实例分析

本文小编为大家详细介绍“Python的pickle序列化和JSON序列化实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python的pickle序列化和JSON序列化实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-06-30

python中json序列化的东东

之所以写这个因为自己总是弄混了,容易弄错,记下来有事没事看看 序列化是指把变量从内存中变成可存储或传输的过程称之为序列化用(使用dump或者dumps),把变量内容从序列化的对象重新读到内存里称之为反序列化(使用load或者loads)如果
2023-01-30

怎么在python中序列化JSON

今天就跟大家聊聊有关怎么在python中序列化JSON,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比
2023-06-14

python Json与pickle数据序列化

在程序运行的过程中,所有的变量都是在内存中。一旦程序结束,变量所占用的内存就被操作系统全部回收。为了避免数据丢失,把变量从内存中变成可存储或传输的过程称之为序列化序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过
2023-01-30

Python数据序列化的pickle模块怎么用

这篇文章主要介绍了Python数据序列化的pickle模块怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python数据序列化的pickle模块怎么用文章都会有所收获,下面我们一起来看看吧。前言:在英语中
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录