5.2 序列化模块

​ 将一种数据结构转换成一种特殊的序列(字符串或bytes)的过程就叫序列化。这个特殊的序列还可以通过命令反解回原来的数据类型。

python中有三种序列化的功能模块:

json模块:

​ 不同语言间遵循的一种数据转化格式,序列化为不同语言都能使用的特殊字符串;json只支持部分python数据结构(int,str,bool,tuple,float,dict)

​ 使用最多

pickle模块:

​ python独有的一种数据转化格式,支持python所有的数据类型包括实例化对象。

shelve模块:

​ 类似于操作字典的方式操作特殊的字符串

5.2.1 json模块

json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去

​ 序列化模块总共只有两种用法,要不就是用于网络传输的中间环节,要不就是文件存储的中间环节,所以json模块总共就有两对四个方法:

用于网络传输:dumps、loads

用于文件写读:dump、load

dumps、loads
  1. import json #加载json模块
  2. ret = {2:'哈哈',1:'你好'}
  3. ret_dm = json.dumps(ret,sort_keys=True) #使用dumps进行格式转换,sort_keys=True是指使用key排序
  4. print(ret_dm) #输出{"1": "\u4f60\u597d", "2": "\u54c8\u54c8"}
  5. ret_lo = json.loads(ret_dm) #转换回来
  6. print(ret_lo) #输出{'1': '你好', '2': '哈哈'}

【注意】

  • json转换完的字符串类型的字典中的字符串是由""表示的;
  • 要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
  1. # 配合文件使用
  2. import json
  3. ret = {2:'你好',1:'哈哈'}
  4. ret_dm = json.dumps(ret,sort_keys=True)
  5. with open('dum.json',mode='w',encoding='utf-8') as f:
  6. f.write(ret_dm)
  7. with open('dum.json',mode='r',encoding='utf-8') as f1:
  8. s = f1.read()
  9. ret_lo = json.loads(s)
  10. print(ret_lo)
dump、load
  1. import json
  2. dic = {2:'你好',1:'哈哈'}
  3. with open('dum.json',mode='w',encoding='utf-8') as f:
  4. json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
  5. with open('dum.json',mode='r',encoding='utf-8') as f1:
  6. print(json.load(f1)) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回

【说明】

  • ensure_ascii:当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。
  • separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’)这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
  • sort_keys:将数据根据keys的值进行排序。
序列化存储多个数据

【原则】:一个json文件只能存储一个json数据

  1. dic1 = {'name':'盖伦'}
  2. dic2 = {'name':'皇子'}
  3. dic3 = {'name':'赵信'}
  4. with open('序列化',encoding='utf-8',mode='a') as f1:
  5. str1 = json.dumps(dic1)
  6. f1.write(str1+'\n')
  7. str2 = json.dumps(dic2)
  8. f1.write(str2+'\n')
  9. str3 = json.dumps(dic3)
  10. f1.write(str3+'\n')

5.2.2 pickle模块

pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去。

pickle模块是只能Python语言识别的序列化模块

用于网络传输:dumps、loads

用于文件写读:dump、load

dumps、loads
  1. import pickle
  2. dic = {2:'你好',1:'哈哈'}
  3. st = pickle.dumps(dic)
  4. print(st) #输出b'\x80\x03}q\x00(K\x02X\x06\x00\x00\x00\xe4\xbd\xa0\xe5\xa5\xbdq\x01K\x01X\x06\x00\x00\x00\xe5\x93\x88\xe5\x93\x88q\x02u.'
  5. dic1 = pickle.loads(st)
  6. print(dic1)
dump、load
  1. import pickle
  2. dic = {(1,2):'序列化',1:True,'set':{1,2,3}}
  3. with open('序列化',mode='wb') as f :
  4. pickle.dump(dic,f)
  5. with open('序列化',mode='rb') as f1:
  6. dic1 = pickle.load(f1)
  7. print(dic1)
序列化存储多个数据

dump也是一个一个文件的写入

  1. import pickle
  2. dic1 = {'name':'盖伦'}
  3. dic2 = {'name':'皇子'}
  4. dic3 = {'name':'赵信'}
  5. with open('序列胡',mode='wb') as f:
  6. pickle.dump(dic1,f)
  7. pickle.dump(dic2,f)
  8. pickle.dump(dic3,f)
  9. f.close()
  10. with open('序列化',mode='rb') as f1:
  11. while True:
  12. try:
  13. print(pickle.load(f1))
  14. except EOFError:
  15. break

5.3 OS模块

​ os模块是与操作系统交互的一个接口,它提供的功能多与工作目录,路径,文件等相关操作。

当前目录 = 工作目录 = 父级目录:指的是当前文件所在的文件夹

与工作目录有关
  1. import os
  2. print(os.getcwd()) # 获取当前工作目录的 绝对路径 ***
  3. os.chdir(r'D:\s23\day9') #改变当前工作的工作目录
  4. print(os.getcwd())
  5. print(os.curdir) #返回当前目录
  6. print(os.pardir) #返回当前目录的父目录
与文件夹相关
  1. import os
  2. os.makedirs(r'11\22\33') #创建多层目录
  3. os.removedirs('11/22/33') #若目录为空,则删除目录,并递归到上一级目录,继续判断汉朝
  4. os.mkdir('11') #生成单极目录
  5. os.rmdir('11') #删除单机目录
与文件相关
  1. os.remove() #删除一个文件***
  2. os.rename(oldname,newname) #重命名一个文件***
  3. os.stat('path/filename') 获取文件/目录信息
  4. print(__file__) #动态获取当前文件的绝对路径******
与操作系统相关
  1. print(os.environ) #获取系统的环境变量 ***
  2. os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" *
  3. os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" *
  4. os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: *
  5. os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' *
  6. 和执行系统命令相关
  7. os.system("bash command") 运行shell命令,直接显示 **
  8. os.popen("bash command).read() 运行shell命令,获取执行结果 **
与路径相关path系列
  1. os.path.abspath(path) 返回path规范化的绝对路径 ***
  2. os.path.split(path) path分割成目录和文件名二元组返回 ***
  3. os.path.dirname(path) 返回path的父级目录。其实就是os.path.split(path)的第一个元素 **
  4. print(__file__) #动态获取当前文件的绝对路径******
  5. os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 **
  6. os.path.exists(path) 如果pat文件夹存在,返回True;如果path不存在,返回False ***
  7. os.path.isabs(path) 如果path是绝对路径,返回True **
  8. os.path.isfile(path) 如果path是一个文件路径,返回True。否则返回False ***
  9. os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False ***
  10. os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 ***
  11. os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 **
  12. os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 **
  13. os.path.getsize(path) 返回path的大小 ***

5.4 sys模块

sys模块是与python解释器交互的一个接口

  1. sys.argv 命令行参数List,第一个元素是程序本身路径
  2. sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
  3. sys.version 获取Python解释程序的版本信息
  4. sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 ***
  5. sys.platform 返回操作系统平台名称
  6. exit #强制退出
  7. quit

5.5 hashlib模块

加密模块,是多个加密算法的集合。

hashlib加密:
  1. 将一个bytes类型的数据 通过hashlib进行加密返回 一个等长度的16进制数字.
  2. 过程不可逆.
  3. 相同的bytes类型的数据通过相同的加密方法得到的数字绝对相同.
  4. 不相同的bytes类型的数据通过相同的加密方法得到的数字绝对不相同.

5.5.1 密码加密

MD5加密
  1. import hashlib
  2. ret = hashlib.md5() #步骤一
  3. ret.update('12345'.encode('utf-8')) #步骤二
  4. s = ret.hexdigest() #步骤三
  5. print(s)
撞库
  1. # 撞库,
  2. ret = hashlib.md5()
  3. ret.update('123456*@qwe'.encode('utf-8'))
  4. s = ret.hexdigest()
  5. print(s,type(s))
固定加盐

给普通的MD5加密加一道工序

  1. ret = hashlib.md5('德玛西亚'.encode('utf-8')) # 德玛西亚 就是固定的盐
  2. ret.update('a'.encode('utf-8'))
  3. print(ret.hexdigest())
动态加盐
  1. username = '德玛西亚'
  2. ret = hashlib.md5(username[::2].encode('utf-8')) # 针对于每个账户,每个账户的盐都不一样
  3. ret.update('a'.encode('utf-8'))
  4. print(ret.hexdigest())

5.5.2 文件校验

分段update
  1. import hashlib
  2. s1 = '盖伦 是德玛西亚 最 忠诚的 战士'
  3. # 1
  4. ret = hashlib.md5()
  5. ret.update(s1.encode('utf-8'))
  6. print(ret.hexdigest())
  7. # 2
  8. ret = hashlib.md5()
  9. ret.update('盖伦'.encode('utf-8'))
  10. ret.update(' 是德玛西亚'.encode('utf-8')) #字符串里有空格,一定要加上空格
  11. ret.update(' 最'.encode('utf-8'))
  12. ret.update(' 忠诚的'.encode('utf-8'))
  13. ret.update(' 战士'.encode('utf-8'))
  14. print(ret.hexdigest())
高阶版文件校验
  1. # 基础版,小文件可以这样加密
  2. import hashlib
  3. ret = hashlib.md5()
  4. with open('MD5文件校验',mode='rb') as f1:
  5. content = f1.read()
  6. ret.update(content)
  7. print(ret.hexdigest())
  8. #高阶版,不占用很多的内存
  9. ret = hashlib.md5()
  10. with open('python-3.7.4rc1-embed-win32.zip',mode='rb') as f1:
  11. while 1 :
  12. s = f1.read(1024)
  13. if s:
  14. ret.update(s)
  15. else:
  16. break
  17. x = ret.hexdigest()
  18. print(x)

python学习之模块-模块(二)的更多相关文章

  1. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  2. Python学习day18-常用模块之NumPy

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  3. Python学习 Part4:模块

    Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...

  4. Python学习day19-常用模块之re模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. 《Python学习手册》(二)

    <Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...

  6. Python学习 :常用模块(二)

    常用模块(二) 四.os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir( ...

  7. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  8. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  9. Python学习笔记1—模块

    模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11   (module11是module的子模块) 例: ...

  10. python学习之random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

随机推荐

  1. constant read 和 current read

    来自网络,并且在本机实验完成: onsistent read :我的理解,就是通过scn来读取.  读取的过程中要保证 scn是一致的.举个例子,一个SELECT 语句在SCN=100的时刻开始读取一 ...

  2. Class.forName()方法抛出异常

    在测试static块时间,想要调用Class.forName()来加载类,需要注意此方法要求必须要抛出异常,否则报错. 但在之后却一直抛出java.lang.ClassNotFoundExceptio ...

  3. web性能优化-浏览器工作原理

    要彻底了解web性能优化的问题,得搞清楚浏览器的工作原理. 我们需要了解,你在浏览器地址栏中输入url到页面展示的短短几秒中,浏览器究竟做了什么,才能了解到为什么我们口中所说的优化方案能够起到优化作用 ...

  4. Rest_Framework简介

    Web应用模式 在开发Web应用中,有两种应用模式:前后端不分离和前后端分离 前后端不分离 前后端不分离通俗来讲就是不区分前端和后端,浏览器请求时服务器直接返回页面,其示意图如下 前后端分离 前后端分 ...

  5. qt5--列表控件QListWidget

    需要   #include <QListWidget>            #include <QListWidgetItem> 列表控件可以让我们以列表形式呈现内容,是界面 ...

  6. buuctf@helloword

  7. JS 全局作用域和局部作用域

    一.作用域 1.什么是作用域(Scope) 通常来说,一段程序代码中所用到的名字不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域. JS作用域:就是代码名字(变量)作用的范围 ...

  8. Unity3D_(API)场景切换SceneManager

    Unity场景切换SceneManager 官方文档:传送门 静态方法 创建场景 CreateScene Create an empty new Scene at runtime with the g ...

  9. 如何将项目托管到Github上

    将本地项目放到GitHub上托管并展示 传送门 利用Github Pages展示自己的项目 传送门 git Please tell me who you are解决方法 传送门 git config ...

  10. BOM—Browser Object Model and DOM—Document Object Model

    浏览器对象模型的内涵是每个页面都是一个window对象,而dom是document为基准的模型,而document与wimdow.document指向相同,所以可以这么理解,bom模型的定义是包括do ...