Json & pickle 数据序列化
前提:
文本文件中只能写入字符串或ascii码格式的内容。
info={'name':'zoe','age':18}
f=open('test.txt','w')
f.write(info)  #在文本文件中写入字典格式的内容,执行会报错。
f.closed()

变通方式将 f.write(info) 改为 f.write(str(info))。
但是这种写法比较低端。
同时,将文件通过open()读取到环境中,读取进来的还是字符串格式的。上面的操作是序列化,读取文件后的操作时反序列化。
f=open('test.txt','r')
data=f.read()
print(type(data))   #返回class 'str'
#想要保留数据的原本的格式,还需要将数据转化。
data_new=eval(data)
print(type(data_new))
print(data_new)
返回:

但是上面的序列化和反序列化的方式不是常规的用法。只是在我们不了解序列化模块json,pickle的时候的用法。接下来我们介绍用于序列化的两个模块。
用于序列化的两个模块
- json,用于字符串 和 python数据类型间进行转换
 - pickle,用于python特有的类型 和 python的数据类型间进行转换
 
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json

实例1:
import json
info={'name':'zoe','age':18}
f=open('test.txt','w')
f.write(json.dumps(info)) #序列化。将info转换为字符串,写入文本文件中
f.close()
import json
f=open('test.txt','r')
data=json.loads(f.read()) #反序列化。用loads方法将字符串
print(data(type))
f.close()
实例2:
>>> import json
>>> def sayhi(name):
print('hello,',name) >>> info={'name':'zoe','age':18,'func':sayhi}
>>> f=open('test.txt','w') >>> f.write(json.dumps(info)) #函数sayhi的内存地址不是json可以序列化的参数。
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
f.write(json.dumps(info))
File "C:\Users\Zoe\Anaconda3\lib\json\__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 198, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 256, in iterencode
return _iterencode(o, 0)
File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 179, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function sayhi at 0x000000000317F8C8> is not JSON serializable
所以,json只能支持简单的数据类型,如字典,列表,字符串等。——
json主要用于不同的语言之间进行数据交互。比方说java和python之间的字典的交互,类,函数等复杂的json是无法进行处理,在不同语言之间进行交互。
xml主要在不同的语言和程序之间进行数据交互,是一种标记式的语言,正在逐渐被json给取代。因为json更简洁,更清晰。json是目前主流的在不同语言之间进行数据交互的模块。
json只能处理简单的,而pickle是用来处理复杂的数据类型。
json和pickle的操作和json一模一样。
pickle

实例1:
import pickle
def sayhi(name):
print('hello,',name) info={'name':'zoe','age':18,'func':sayhi}
f=open('test.txt','wb') #以二进制方式写入文件
f.write(pickle.dumps(info)) #pickle.dump(info,f)完全等价
f.close()

反序列化:
import pickle
def sayhi(name):
print('hello world',name) f=open('test.txt','rb')
a=pickle.loads(f.read()) #完全等价于pickle.load(f)
print(a)
a['func']('zoe')
'''如果反序列化中程序中没有sayhi()函数,则会报错。然而,在程序中有定义的同名的sayhi()函数即可读取并调用。
两个程序之间的内存地址是不能互相访问的,所以在函数序列化中,
pickle只能在python中使用。'''

小知识:
json和pickle在文件写入过程中dumps两次,会写入两次;
json和pickle在文件中loads,在3.x中只能loads一次。
在2.x中第一次dump的,可以第一次loads。但是这个不好。
所以对于同一个文件的写入和读取记住只dump一次,load一次。如果想要每个都要dump一次,则dump成不同的文件。
Json & pickle 数据序列化的更多相关文章
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化
		
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
 - python基础6之迭代器&生成器、json&pickle数据序列化
		
内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...
 - 迭代器/生成器/装饰器 /Json & pickle 数据序列化
		
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
 - Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
		
装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能 原则: 1.不能修改被装饰的函数的源代码. 2.不 ...
 - json&pickle数据序列化模块
		
用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...
 - Python3 json &pickle 数据序列化
		
json 所有语言通用的信息交换格式 json.dumps()将list列表.dict字典.元组.函数等对象转换为可以存储的字符格式存入文件 json.dump(数据对象名,已以写方式打开的对象) 直 ...
 - json & pickle数据序列化
		
序列化:把内存中的数据对象变成字符串 info = { 'name':'tom', 'age':22 } f = open("test.txt","w") f. ...
 - day04 装饰器  迭代器&生成器  Json & pickle 数据序列化  内置函数
		
回顾下上次的内容 转码过程: 先decode 为 Unicode(万国码 ) 然后encode 成需要的格式 3.0 默认是Unicode 不是UTF-8 所以不需要指定 如果非要转为U ...
 - 装饰器、生成器,迭代器、Json & pickle 数据序列化
		
1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...
 
随机推荐
- 使用xlsxwriter模块和xlrd模块操作Excel表格
			
1.xlsxwriter模块介绍:主要用来生成excel表格,插入数据.插入图标等表格操作 如下代码:目的是往demo01.xlsx插入数据和图片 # 导入xlsxwriter模块:主要用来修改表格的 ...
 - touch方向锁定
			
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
 - Appium自动化(2) - appium环境安装常见问题的解决方案
			
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 问题1:adb检测不到设备 解决 ...
 - 1061 Dating (20分)
			
Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2984akDfkkkkg ...
 - 【数据库】MySQL数据库(二)
			
一.数据库文件的导出 1.在DOS命令行下导出数据库(带数据) mysqldump -u root -p 数据库名 > E:\wamp\www\lamp175\lamp175.sql 2.在DO ...
 - Java第二十五天,多线程之等待唤醒机制
			
当线程被创建并且被启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,而是具有以下多种状态: 这六种状态之间的转换关系如下: 1.等待唤醒机制 注意: (1)两个线程之间必须用同步代码块 ...
 - Dubbo 路由机制的实现
			
Dubbo 路由机制是在服务间的调用时,通过将服务提供者按照设定的路由规则来决定调用哪一个具体的服务. 路由服务结构 Dubbo 实现路由都是通过实现 RouterFactory 接口.当前版本 du ...
 - Java 泛型、通配符? 解惑
			
Java 泛型通配符?解惑 分类: JAVA 2014-05-05 15:53 2799人阅读 评论(4) 收藏 举报 泛型通配符上界下界无界 目录(?)[+] 转自:http://www.linux ...
 - C# 基础知识系列- 10 反射和泛型(二)
			
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
 - Spring Boot 集成 Spring Security 入门案例教程
			
前言 本文作为入门级的DEMO,完全按照官网实例演示: 项目目录结构 Maven 依赖 <parent> <groupId>org.springframework.boot&l ...