前提:

文本文件中只能写入字符串或ascii码格式的内容。

  1. info={'name':'zoe','age':18}
  2. f=open('test.txt','w')
  3. f.write(info) #在文本文件中写入字典格式的内容,执行会报错。
  4. f.closed()

变通方式将 f.write(info) 改为 f.write(str(info))。

但是这种写法比较低端。

同时,将文件通过open()读取到环境中,读取进来的还是字符串格式的。上面的操作是序列化,读取文件后的操作时反序列化。

  1. f=open('test.txt','r')
  2. data=f.read()
  3. print(type(data)) #返回class 'str'
  4. #想要保留数据的原本的格式,还需要将数据转化。
  5. data_new=eval(data)
  6. print(type(data_new))
  7. print(data_new)

返回:

但是上面的序列化和反序列化的方式不是常规的用法。只是在我们不了解序列化模块json,pickle的时候的用法。接下来我们介绍用于序列化的两个模块。

用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

json

实例1:

  1. import json
  2. info={'name':'zoe','age':18}
  3. f=open('test.txt','w')
  4. f.write(json.dumps(info)) #序列化。将info转换为字符串,写入文本文件中
  5. f.close()
  1. import json
  2. f=open('test.txt','r')
  3. data=json.loads(f.read()) #反序列化。用loads方法将字符串
  4. print(data(type))
  5. f.close()

实例2:

  1. >>> import json
  2. >>> def sayhi(name):
  3. print('hello,',name)
  4.  
  5. >>> info={'name':'zoe','age':18,'func':sayhi}
  6. >>> f=open('test.txt','w')
  7.  
  8. >>> f.write(json.dumps(info)) #函数sayhi的内存地址不是json可以序列化的参数。
  9. Traceback (most recent call last):
  10. File "<pyshell#12>", line 1, in <module>
  11. f.write(json.dumps(info))
  12. File "C:\Users\Zoe\Anaconda3\lib\json\__init__.py", line 230, in dumps
  13. return _default_encoder.encode(obj)
  14. File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 198, in encode
  15. chunks = self.iterencode(o, _one_shot=True)
  16. File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 256, in iterencode
  17. return _iterencode(o, 0)
  18. File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 179, in default
  19. raise TypeError(repr(o) + " is not JSON serializable")
  20. 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:

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

反序列化:

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

小知识:

json和pickle在文件写入过程中dumps两次,会写入两次;

json和pickle在文件中loads,在3.x中只能loads一次。

在2.x中第一次dump的,可以第一次loads。但是这个不好。

所以对于同一个文件的写入和读取记住只dump一次,load一次。如果想要每个都要dump一次,则dump成不同的文件。

Json & pickle 数据序列化的更多相关文章

  1. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  2. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  3. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  4. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  5. json&pickle数据序列化模块

    用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...

  6. Python3 json &pickle 数据序列化

    json 所有语言通用的信息交换格式 json.dumps()将list列表.dict字典.元组.函数等对象转换为可以存储的字符格式存入文件 json.dump(数据对象名,已以写方式打开的对象) 直 ...

  7. json & pickle数据序列化

    序列化:把内存中的数据对象变成字符串 info = { 'name':'tom', 'age':22 } f = open("test.txt","w") f. ...

  8. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

  9. 装饰器、生成器,迭代器、Json & pickle 数据序列化

    1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...

随机推荐

  1. 三角函数在Three.js中的点的移动轨迹应用

    在学习2D文字的时候,看到官网有这样一个示例: https://threejs.org/examples/#css2d_label ![](https://img2018.cnblogs.com/bl ...

  2. JS同步和异步的理解

    js的同步和异步问题通常是指ajax的回调,如果是同步调用,程序在发出ajax调用后就会暂停,直到远程服务器产生回应后才会继续运行.而如果是异步调用,程序发出ajax调用后不会暂停,而是立即执行后面的 ...

  3. 原生js弹力球

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. linux系统管理,查看系统资源

    free 查看内存使用情况 -b  ===>  以byte为单位 -k  ===>  以Kb为单位 -m  ===>  以Mb为单位 -g  ===>  以Gb为单位 -t  ...

  5. IDEA使用技巧,如何在JSP中创建Servlet“小程序”

    步骤 1.新建一个java类,实现Servlet接口 2.实现接口中的抽象方法: 3.在web.xml文件中配置好servlet <web-app ......> <servlet& ...

  6. 第一章 AT&T

    1.一个公司(企业)越庞大,就越危险:越复杂,就越濒临坍塌:快速发展的同时,也埋下了隐患. 2.再庞大的企业也不可能永久站立,下个十年谁也说不准谁会在浪潮之巅. 3.一个人能走多远,往往取决于他能看多 ...

  7. Python之 module安装

    如出现这种错误 ModuleNotFoundError: No module named 'numpy' 这种错误通常不会出现,因为Python的模块,通常在你安装Python shell的时候,就已 ...

  8. centos7安装MariaDB以及Failed to start mariadb.service: Unit not found的错误解决

    centos7下yum安装MariaDB CentOS 7下mysql下替换成MariaDB了.MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权 许可 Mari ...

  9. alg-最长不重复子串

    class Solution { public: int lengthOfLongestSubstring(const std::string& s) { int max_length = 0 ...

  10. python简易的大乐透数据获取及初步分析

    该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具. https://github.com/unknowcry/Lottery # -*- coding: utf-8 -* ...