字符串存储

一般需要有信息需要记录的都写到文件上面,把要记录的信息转成字符串,然后在写入到文件中。这算是一种记录方式。

比如有一组用户信息需要存起来。数据定义好之后就可以写文件。

info = {
'name' : 'alex',
'age':22
} with open('test.txt','w')as f:
f.write(str(info))

test.txt

{'name': 'alex', 'age': 22} # 这里当作字符串写进来了

读取信息就需要读文件了。

with open('test.txt','r',encoding='utf-8') as f:
data = eval(f.readline()) print(data['name']) #alex

这种是要手动转下字符串,Python内置模块中还有一种序列化的方式。

json模块

json模块提供了数据序列化和反序列化的功能。

先看下序列化之后的数据是什么格式的:

import json
info = {
'name' : 'alex',
'age':22
} print(type(json.dumps(info)),[json.dumps(info)])#<class 'str'> ['{"name": "alex", "age": 22}']

可以看出来,序列化之后的数据是字符串类型的(放列表里面更容易看出来)。

既然是字符串,那么就可以写到文件里面。

写文件

import json #json模块
info = {
'name' : 'alex',
'age':22
} with open('test.txt','w')as f:
f.write(json.dumps(info)) #序列化并写入文件

读文件

import json #加载json模块
with open('test.txt','r',encoding='utf-8') as f:
data = json.loads(f.read()) #读文件并反序列化 print(data['name']) #alex

跟上面手动转字符串格式的效果一样,但是这种方法比上面上面那种更好。而且json的数据格式在很多语言中都通用。

虽然json比较通用,但是只能传递一些简单的数据。如果需要处理一些复杂的数据还有一个模块可以使用。

pickle模块

功能和json一样,也是可以序列化和反序列化数据的,但是pickle可以处理一些复杂的数据。

不同的地方是 pickle序列化之后的数据是二进制格式的。

import pickle

info = {
'name' : 'alex',
'age':22
} print(type(pickle.dumps(info)),[pickle.dumps(info)])#<class 'bytes'> [b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00alexq\x02X\x03\x00\x00\x00ageq\x03K\x16u.']

还用之前的例子处理一次。

写文件

import pickle
info = {
'name' : 'alex',
'age':22
} with open('test.txt','wb')as f: #因为是二进制,所以是wb
f.write(pickle.dumps(info)) #和json一样的方法

读文件

import pickle
with open('test.txt','rb') as f:
data = pickle.loads(f.read())
print(data['name']) #alex

pickle不仅可以序列化简单的数据结构,包括复杂的,比如函数、类等。

比如在上面的数据中加入一个函数。

写文件

import pickle
def fun1(name): #这里定义了一个函数,并且把函数作为一个value,这里传递过去的应该是一个空间地址。
print('hello ',name) info = {
'name' : 'alex',
'age':22,
'fun':fun1
} with open('test.txt','wb')as f:
f.write(pickle.dumps(info))

读文件

还是用之前的方式读

import pickle
with open('test.txt','rb') as f:
data = pickle.loads(f.read())
print(data) #AttributeError: Can't get attribute 'fun1' on <module '__main__' from 'E:/pywww/day03/04.py'>

但是这里却给我报了一个错误。

把之前的函数拿过来。

import pickle
def fun1(name):
print('hello ',name)
with open('test.txt','rb') as f:
data = pickle.loads(f.read())
print(data) #{'name': 'alex', 'fun': <function fun1 at 0x00000000010F0048>, 'age': 22}
print(data['fun']('alex')) #hello alex #None

这里并没有报错,而且函数还可以使用。 那这个函数的内容能不能被修改呢?

import pickle
def fun1(name):
print('hello2222 ',name) #这里打印的内容做了修改
with open('test.txt','rb') as f:
data = pickle.loads(f.read())
print(data['fun']('alex')) #hello2222 alex #None

依然是可以的,两个程序中的内存地址是不可能一样的,那么序列化的内容就不是内存地址,而是整个数据对象。

另外,pickle中还有两个方法可以实现以上效果。dump和load,这两个方法与dumps和loads的区别就是把文件内容、文件句柄作为参数,可以不用写f.write()和f.read().

dump写文件

import pickle
def fun1(name):
print('hello ',name) info = {
'name' : 'alex',
'age':22,
'fun':fun1
} with open('test.txt','wb')as f:
pickle.dump(info,f) #文件内容、句柄作为参数

load读文件

import pickle
def fun1(name):
print('hello2222 ',name)
with open('test.txt','rb') as f:
data = pickle.load(f) #句柄作为参数
print(data['fun']('alex')) #hello2222 alex #None

效果是一样的。

python--json和pickle序列化的更多相关文章

  1. (转)python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    阅读目录 1.1.1导入模块 1.1.2__name__ 1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代 ...

  2. json and pickle 序列化

    前言 文件只能存储字符串.二进制,若把内存的数据对象存到硬盘   从硬盘里读取数据,里面不止是字符串的类型,因此用到了json and pickle 序列化 json序列化 作用:用于不同语言进行的数 ...

  3. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  4. Python的json and pickle序列化

    json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = ...

  5. Python json和pickle模块

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  6. (1)json和pickle序列化模块

    json 和pickle 模块 json和pickle模块下都有4个功能 dumps  <---> loads  (序列化 <--->反序列化) dump <---> ...

  7. Python3 json、pickle序列化与反序列化

    注意:可以dumps多次,loads只能一次,一般我们只dumps一次,loads一次,多个版本就写入多个文件 一.json序列化与反序列化: 支持各种语言数据交互,但只能处理字典,列表,集合等简单的 ...

  8. json和pickle序列化模块

    一.json序列化模块 1.序列化:将内存数据转成字符串加以保存. 2.反序列化:将字符串转成内存数据加以读取. data = { '北京':{ '五道口':{ 'sohu':'引擎', } } } ...

  9. python json、 pickle 、shelve 模块

    json 模块 用于序列化的模块 json,用于字符串 和 python数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load #!/usr/bin/env pyt ...

  10. python json、pickle

    文章部分转自:https://www.cnblogs.com/lincappu/p/8296078.html json:用于字符串和Python数据类型间进行转换pickle: 用于python特有的 ...

随机推荐

  1. select和epoll原理和区别

    对于select和poll,其主要原理跟epoll不同 poll和select的共同点就是,对全部指定设备(fd)都做一次poll,当然这往往都是还没有就绪的,那就会通过回调函数把当前进程注册到设备的 ...

  2. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  3. springboot整合mybatis,redis,代码(三)

    一 说明 接着上篇讲述redis缓存配置的用法: 二 正文 首先要使用缓存就必须要开开启缓存,第二步是需要开redis-server 下载redis包之后,点击图中两个都可以开启redis 怎么看是否 ...

  4. 在生产环境下禁用swagger

    学习目标 快速学会使用注解关闭Swagger2,避免接口重复暴露. 使用教程 禁用方法1:使用注解@Profile({"dev","test"}) 表示在开发或 ...

  5. Git 的简单测试

    Git 简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开 ...

  6. java背包的数组实现,链表实现

    数组实现 package base.structure; import java.lang.reflect.Array; import java.util.Iterator; /** * @progr ...

  7. MySQL 关联查询  外连接 { LEFT| RIGHT } JOIN

    左外连接: (以左表为基准)两张表做连接的时候,在连接条件不匹配的时候留下左表中的数据,而右表中的数据以NULL填充例:使用左连接把学生的数据全取出来,该学生没有学院信息的用NULL填充 mysql& ...

  8. MySQL 关联查询 内连接

    内连接    [INNER| CROSS] JOIN无条件内连接:无条件内连接,又名交叉连接/笛卡尔连接第一张表种的每一项会和另一张表的每一项依次组合#例:mysql>  select  *  ...

  9. 【笔记】MySQL的基础学习(二)

    [笔记]MySQL的基础学习(二) MySQL 老男孩  一 视图 视图其实就是给表起个别名 1.创建视图 格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS ...

  10. BFS + 状态搜索

    题目 题意 给一个100x100的迷宫,'.'表示路面,'S'表示起点,'T'表示终点:'#'表示毒气区,进入毒气区必须要消耗一个氧气:'B'表示氧气区,每次进入自动获得一个氧气,可反复进入从而获得多 ...