序列化模块

首先我们来看一个序列:'sdfs45sfsgerg4454287789sfsf&*0'

序列 —— 就是字符串
序列化 —— 从数据类型 --> 字符串的过程
反序列化 —— 从字符串 --> 数据类型的过程

首先要了解到的是:一般没事不会把一个其他数据类型转化为字符串,因为这样功能就变少了,如:字典,列表...

序列化模块
json *****(非常重要)
pickle ****
shelve ***

json
  数字 字符串 列表 字典 元组
  通用的序列化格式(语言界的英语)
  只有很少的一部分数据类型能够通过 json 转化成字符串
pickle
  所有的 python 中的数据类型都可以转化成字符串形式
  pickle 序列化的内容只有 python 能理解
  且部分反序列化依赖 python 代码
  比如:用于游戏中
shelve
  序列化句柄(shelve 句柄)
  使用句柄直接操作,非常方便

json 序列化

json   (dumps  loads
  dumps(序列化方法)、loads(反序列化方法),这两个直接对内存中的数据进行操作
  json 本身是单引号的,内部原本是字符串元素要用双引号

json.dumps

  1. import json
  2. data = {'username':['李华','二愣子'],'sex':'male','age':16}
  3. json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
  4. print(json_dic2)

sort_keys=True    排序
indent         整齐打印,填充物为空格
separators=()       紧凑编码
ensure_ascii=False   输出为中文,(中文显示默认为 ascii 码)

  1. dic = {"k":'v'}
  2. print(type(dic),dic) #输出结果:<class 'dict'> {'k': 'v'}
  3. str_d = json.dumps(dic) #序列化
  4. print(type(str_d),str_d) #输出结果:<class 'str'> {"k": "v"}

json.loads

  1. #接上面的例子中 str_d
  2. dic_d = json.loads(str_d) #反序列化
  3. print(type(dic_d),dic_d) #输出结果:<class 'dict'> {'k': 'v'}

元组也可以序列化(但被当做列表处理了)

  1. dic = (1,2,3)
  2. print(type(dic),dic)
  3.  
  4. str_d = json.dumps(dic)
  5. print(type(str_d),str_d)
  6.  
  7. dic_d = json.loads(str_d)
  8. print(type(dic_d),dic_d)
  9.  
  10. #输出结果如下
  11. #<class 'tuple'> (1, 2, 3)
  12. #<class 'str'> [1, 2, 3]
  13. #<class 'list'> [1, 2, 3]

dump(序列化方法)、load(反序列化方法),这两个是对文件相关的操作
dump load 一次性写入 一次性读出

  1. import json
  2. dic = {1:"a",2:"b"}
  3.  
  4. f = open('D:/py/file.txt','w',encoding='utf-8')
  5. ret = json.dump(dic,f)
  6. f.close()
  7. print(type(ret),ret) #输出结果:<class 'NoneType'> None
  8.  
  9. f = open('D:/py/file.txt',encoding='utf-8')
  10. res = json.load(f)
  11. f.close()
  12. print(type(res),res) #输出结果:<class 'dict'> {'2': 'b', '1': 'a'}
  13.  
  14. with open('D:/py/file.txt','w',encoding='utf-8')as f:
  15. ret = json.dump(dic,f)
  16. print(type(ret),ret)
  17.  
  18. with open('D:/py/file.txt',encoding='utf-8')as f:
  19. res = json.load(f)
  20. print(type(res),res)
  21.  
  22. #文件中的结果:{"1": "a", "2": "b"}

改写为中文字符:ensure_ascii=False

  1. import json
  2. dic = {1:"雷诺",2:"诺娃"}
  3.  
  4. with open('D:/py/file.txt','w',encoding='utf-8')as f:
  5. ##ret = json.dump(dic,f)
  6. ret = json.dump(dic,f,separators=(',',':'),ensure_ascii=False)
  7. print(type(ret),ret) #输出结果:<class 'NoneType'> None
  8.  
  9. with open('D:/py/file.txt',encoding='utf-8')as f:
  10. res = json.load(f)
  11. print(type(res),res) #输出结果:<class 'dict'> {'1': '雷诺', '2': '诺娃'}
  12.  
  13. ##文件中的结果:{"1": "\u96f7\u8bfa", "2": "\u8bfa\u5a03"}
  14. #文件中的结果:{"1":"雷诺","2":"诺娃"}

pickle 序列化模块

pickle 模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  不仅可以序列化字典,列表...可以把 python 中任意的数据类型序列化)

  1. import pickle
  2. dic = {'k1':'v1','k2':'v2','k3':'v3'}
  3. str_dic = pickle.dumps(dic)
  4. print(str_dic) #一串二进制内容
  5.  
  6. dic2 = pickle.loads(str_dic)
  7. print(dic2) #字典
  8.  
  9. import time
  10. struct_time = time.localtime(1000000000)
  11. print(struct_time)
  12. f = open('pickle_file','wb')
  13. pickle.dump(struct_time,f)
  14. f.close()
  15.  
  16. f = open('pickle_file','rb')
  17. struct_time2 = pickle.load(f)
  18. print(struct_time2.tm_year)

模块的导入

模块导入的流程
  先从sys.modules里查看是否已经被导入,即:模块不会被重复导入
  如果没有被导入,就依据sys.path路径取寻找模块
  找到了就导入
  创建这个模块的命名空间
  执行文件,把文件中的名字都放到命名空间里
  import sys
  print(sys.modules.keys())
  print(sys.path)

导入 demo 及其中的函数

  1. import demo
  2. demo.reads()
  3. #输出结果:还是这个模块

函数的别名

设置别名后,只有别名可以用,原来的函数名已经是过去式了

  1. import time as t
  2. print(t.time())
  3. print(time.time()) #NameError: name 'time' is not defined

模块的集体调用

  1. #模块的导入要写在文件的最开始导入
  2. #先导入内置模块——再导入扩展模块——之后是自定义的(这样分为三行写)
  3. import timesysos #不推荐这样写 不利于可读性和加大的修改成本
  4. import time
  5. import sys
  6. import os

from ... import ...

当使用改种方法时,times 函数就变为了全局函数
如果在自己的文件中在 创建一个 times(),则 demo 中的 times 会被覆盖掉
使用改种的优点是节省内存,只把自己需要的函数名拿过来,直接使用 import 是把被调用的文件中的函数名都拿来了

  1. from demo import times
  2. print(times())
  3.  
  4. from demo import times,reads #使用逗号隔开 调用多个
  5. from demo import * #相当于调用 demo 中的所有(不安全,尽量不要用)

第四种
form demo import * 与 __all__ = [''] 的关联使用

  1. #当使用这种模式调用模块时: form demo import * 与 __all__ = ['']
  2. #此时就只能调用 __all__ 对应列表中的函数
  3. from demo import * #__all__ = ['times']
  4. print(times())
  5. reads() #报错 NameError: name 'reads' is not defined

小结:

所有的模块导入都应该尽量往上写(顺序如下)
  内置模块
  扩展模块
  自定义模块
模块不会重复被导入 : sys.moudles
从哪儿导入模块 : sys.path

import
  import 模块名
  模块名.变量名 和本文件中的变量名完全不冲突
  import 模块名 as 重命名的模块名 : 提高代码的兼容性
  import 模块1,模块2(不推荐使用)

from ... import ...
  from 模块名 import 变量名
  直接使用 变量名 就可以完成操作
  如果本文件中有相同的变量名会发生冲突

from 模块名 import 变量名字 as 重命名变量名
  from 模块名 import 变量名1,变量名2
  from 模块名 import *
  将模块中的所有变量名都放到内存中
  如果本文件中有相同的变量名会发生冲突

from 模块名 import * 和 __all__ 是一对
  没有这个变量,就会导入所有的名字
  如果有 all 只导入 all 列表中的名字

__name__
  在模块中 有一个变量 __name__
  当我们直接执行这个模块的时候,__name__ == '__main__'
  当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'

day 20 - 1 序列化模块,模块的导入的更多相关文章

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

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

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

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

  3. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  4. python常用模块 以及第三方导入

    python常用模块 1模块的分类 标准模块(内置模块)( 标准库 )300 第三方模块 18万 pip install 直接通过pip安装 软件一般会被自动安装你python安装目录的这个子目录里 ...

  5. Python模块02/序列化/os模块/sys模块/haslib加密/collections

    Python模块02/序列化/os模块/sys模块/haslib加密/collections 内容大纲 1.序列化 2.os模块 3.sys模块 4.haslib加密 5.collections 1. ...

  6. Python之路-python(面向对象进阶(模块的动态导入、断言、Socket Server))

    模块的动态导入 断言 Socket Server 一.模块的动态导入 class C(object): def __init__(self): self.name = "zhangsan&q ...

  7. day15 十五、模块、from导入、起别名

    一.模块的概念 1.什么是模块:一系列功能的集合体 2.定义模块:创建一个py文件就是一个模块,该py文件名就是模块名 模块的四种存在方式 使用python编写的.py文件 包:一堆py文件的集合体 ...

  8. 第十八篇 模块与包--time&random模块&模块导入import(os.path.dirname(os.path.abspath(__file__)))

    模块 在Python中, 一个.py文件就称为一个模块. 使用模块的好处: 1. 最大的好处就是大大提高了代码的可维护性 2. 编写代码不必从零开始.一个模块编写完毕,就可以被其他地方引用.在写其他程 ...

  9. Python之模块和包导入

    Python之模块和包导入 模块导入: 1.创建名称空间,用来存放模块XX.py中定义的名字 2.基于创建的名称空间来执行XX.py. 3.创建名字XX.py指向该名称空间,XX.名字的操作,都是以X ...

随机推荐

  1. Linux 压缩某个文件夹命令

    tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.ta ...

  2. React 系列教程2:编写兰顿蚂蚁演示程序

    简介 最早接触兰顿蚂蚁是在做参数化的时候,那时候只感觉好奇,以为是很复杂的东西.因无意中看到生命游戏的 React 实现,所以希望通过兰顿蚂蚁的例子再学习一下 React. 兰顿蚂蚁的规则非常简单: ...

  3. SSZipArchive的使用详解和遇到的问题

    https://blog.csdn.net/zhengang007/article/details/51019479 2016年03月30日 版权声明:本文为博主原创文章,转载请注明作者和原文链接. ...

  4. MarkDownPad2基本语法

    一.换行和空格   (1)换行   行尾加两个空格   (2)空格     二.标题   在#后跟个空格再写文字,一个#是一级标题,两个#是二级标题,以此类推,支持六级标题.   示例: # 一级标题 ...

  5. Python测试模块doctest

    面试被问到了却没有用过,很尴尬:今天看了一下,真的是一个很简单的测试模块 方便起见,这里直接拿菜鸟教程的介绍和例子过来 开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试 ...

  6. java学习——JDK1.8接口和实现类

    Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...

  7. idea标注yml资源配置文件

  8. linux 系统工具图

  9. -bash: fork: Cannot allocate memory 问题的处理

    今天生产机器突然无法登录了,正好有一个用top挂着,但是退出top,执行任何命令都报-bash: fork: Cannot allocate memory,但是查看内存还是有很多空闲,然后在百度上查了 ...

  10. Django_rest framework 框架介绍

    restful介绍  restful协议 一切皆是资源,操作只是请求方式 URL 设计 原先的URL设计方式 在url 中体现出操作行为 /books/ books /books/add/ addbo ...