今日主要内容

  • 内置模块(标准库)

    • 序列化
    • hashlib
    • collections
  • 软件开发规范

一、内置模块(标准库)

(一)序列化模块

  • 什么是序列化?

    • 将一种数据结构(如列表、字典)转换为另一种特殊的数据结构(如字符串、bytes类型)的过程就是序列化过程
    • 数据传输的过程中,传输的都是字节,现在有一个列表需要传输,我需要将列表转换为字符串,在将字符串进行编码,但对方最终接收到的是一个字符串,字符串是不能原封不动的还原成列表的,这时候就需要用到反序列化将字符串转换回列表

1.json模块(重要)

  • json文件相当于编程界的普通话,是各种语言交互的枢纽,当数据需要在多种语言间传输,就必须将数据转换成json字符串,对方将接受到的json字符串再转换成对应语言的数据类型,完美还原

  • json模块方法介绍:

    json.dumps() 将对象序列化
    json.loads() 将对象反序列化
    json.dump() 将对象序列化写入文件
    json.load() 将对象读取后反序列化
    • dumps、loads用于网络传输
    • dump、load用于文件写读
    1. json.dumps()

      • 函数定义:dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
      • 函数说明:将对象序列化为json格式的字符串,其余参数中的ensure_ascii:若对象中出现的非ascii字符(如中文)时会被转换,若显示原字符,指定ensure_ascii=False
      import json
      
      print(json.dumps(["张旭东666"]))
      print(json.dumps(["张旭东666"], ensure_ascii=False)) 运行结果:
      ["\u5f20\u65ed\u4e1c666"]
      ["张旭东666"]
    2. json.loads()

      • 函数定义:loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
      • 函数说明:将json格式的字符串反序列化
      import json
      
      print(json.loads("[1,2,3,4]"))
      print(type(json.loads("[1,2,3,4]"))) 运行结果:
      [1, 2, 3, 4]
      <class 'list'>
    3. json.dump()

      • 函数定义:dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
      • 函数说明:将对象转换为json流写入到文件(fp为文件句柄)中
      import json
      
      with open("text.txt", "w", encoding="utf-8") as f:
      json.dump([1, 2, 3, 4], f)
    4. json.load()

      • 函数定义:load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
      • 函数说明:读取文件句柄并将字符串反序列化
      with open("text.txt", encoding="utf-8") as f:
      lst = json.load(f)
      print(lst)
      print(type(lst)) 运行结果:
      [1, 2, 3, 4]
      <class 'list'>
  • 如果向文件中写入多个json串,无法读取,因为在文件中写入的都是一行内容

    • 解决方法1:将所有内容准备好了一次性写入和读取
    import json
    lst = [{"k1": 1}, {"k2": 2}, {"k3": 3}] # 准备好放在一起
    with open("text.txt", "w+", encoding="utf-8") as f:
    json.dump(lst, f) # 一起写入
    f.seek(0)
    for el in json.load(f): # 一起读取
    print(el) 运行结果:
    {'k1': 1}
    {'k2': 2}
    {'k3': 3}
    • 解决方法2:改用dumpsloads对每一行分别进行处理
    import json
    
    lst = [{"k1": 1}, {"k2": 2}, {"k3": 3}]
    with open("text.txt", "w+", encoding="utf-8") as f:
    for el in lst:
    f.write(json.dumps(el)+"\n") # 利用write和dumps一行一行序列化写入
    f.seek(0)
    for line in f:
    print(json.loads(line)) # 一行一行读取反序列化 运行结果:
    {'k1': 1}
    {'k2': 2}
    {'k3': 3}

2.pickle模块

  • pickle模块将所有数据类型和对象序列化转换成bytes类型(不支持lambda匿名函数),还可以反序列化还原回原数据,pickle模块只能在python语言中使用,其他语言不识别

  • pickle模块支持多行序列化写入和多行读取反序列化功能

  • pickle模块方法介绍:

    pickle.dumps() 将对象序列化
    pickle.loads() 将对象反序列化
    pickle.dump() 将对象序列化写入文件
    pickle.load() 将对象读取后反序列化
    • dumps、loads用于网络传输
    • dump、load用于文件写读
    • pickle的方法和json完全相同,与json的区别就是pickle序列化后是字节,而json序列化后是字符串

3.shelve模块(了解)

  • 了解一下就好,这里不做介绍

(二)hashlib模块

  1. hashlib模块被人称为加密算法、摘要算法等,它的功能是用来对数据进行加密文件校验使用,通过模块中的功能函数将数据转换为一个固定长度的字符串

  2. 数据转换流程:

    • 明文 —— 字节 —— 密文
  3. hashlib模块的特点:

    • 转换的密文没有规律
    • 操作不可逆
    • 不同的bytes类型数据转换的密文一定不同
    import hashlib
    
    sha1 = hashlib.sha1()
    sha1.update("21".encode("utf-8")) # 将21转换为密文
    print(sha1.hexdigest()) sha1 = hashlib.sha1()
    sha1.update("12".encode("utf-8")) # 将12转换为密文
    print(sha1.hexdigest()) 运行结果: # 结果一定不同,且无规律
    472b07b9fcf2c2451e8781e944bf5f77cd8457c8
    7b52009b64fd0a2a49e6d8a939753077792b0554
    • 相同的bytes类型数据转换的密文一定相同
    import hashlib
    
    sha1 = hashlib.sha1()
    sha1.update("12".encode("gbk")) # 用gbk进行编码
    print(sha1.hexdigest())
    sha1 = hashlib.sha1()
    sha1.update("12".encode("utf-8")) # 用utf-8进行编码
    print(sha1.hexdigest()) 运行结果: # 内容相同,无论编码方式是什么,密文一定相同,
    7b52009b64fd0a2a49e6d8a939753077792b0554
    7b52009b64fd0a2a49e6d8a939753077792b0554
  4. 加密方式:

    • md5
    • sha1
    • sha256
    • sha512
  5. 模块应用一:对数据进行加密

    • 方法介绍:

      hashlib.md5() 对应加密方式初始化
      obj.update() 向初始化的对象中添加要加密的内容,内容必须是字节码
      obj.hexdigest() 对对象进行加密
    • 普通加密:

      import hashlib
      
      md5 = hashlib.md5()  # 初始化使用md5加密方式的对象
      md5.update("zxd666".encode("utf-8")) # 向对象添加要加密的内容,内容必须为字节码
      print(md5.hexdigest()) # 进行加密 运行结果:
      fe02a10cda698ceb5a03022189199c49 # 相同明文,密文一定相同
    • 加盐加密:

      • 固定加盐:
      import hashlib
      
      md5 = hashlib.md5("盐".encode("utf-8"))  # 在初始化时可以对要加密的明文进行固定加盐,盐也需要转换为字节码
      md5.update("zxd666".encode("utf-8"))
      print(md5.hexdigest()) 运行结果:
      2bc9ae4e838be80068a6e4963626b92c # 相同明文,密文一定相同
      • 动态加盐:
      import hashlib
      
      user = input("账号:")
      pwd = input("密码:")
      md5 = hashlib.md5(user.encode("utf-8")) # 利用账号来给密码加盐,每个人的账号都不同,起到了动态加盐的效果
      md5.update(pwd.encode("utf-8"))
      print(md5.hexdigest()) 运行结果:
      账号:zxd
      密码:zxd123
      ddca7a4709d99ac8d1b3012b2e6a364a
    • obj.update()方法可以多次添加需要加密的内容

      import hashlib
      
      md5 = hashlib.md5()
      md5.update("zxd".encode("utf-8"))
      md5.update("666".encode("utf-8")) # 可以分开多次添加
      print(md5.hexdigest()) 运行结果:
      fe02a10cda698ceb5a03022189199c49 # 与上面例子中普通加密的密文相同
  6. 模块应用二:用于文件一致性校验

    • linux讲究:一切皆文件,我们普通的文件,视频,音频,图片,以及应用程序等都是文件。我们都从网上下载过资源,比如我们下载的Python解释器,当时你可能没有注意过,其实你下载的时候都是带一个MD5或者shax值的,为什么? 我们的网络世界是很不安全的,经常会遇到病毒,木马等,有些你是看不到的可能就植入了你的电脑中,那么他们是怎么来的? 都是通过网络传入来的,就是你在网上下载一些资源的时候,趁虚而入,当然大部分被我们的浏览器或者杀毒软件拦截了,但是还有一部分偷偷的进入你的磁盘中了。那么我们自己如何验证我们下载的资源是否有病毒呢?这就需要文件的一致性校验了。在我们下载一个软件时,往往都带有一个MD5或者shax值,当我们下载完成这个应用程序时你要是对比大小根本看不出什么问题,你应该对比他们的md5值,如果两个md5值相同,就证明这个应用程序是安全的,如果你下载的这个文件的MD5值与服务端给你提供的不同,那么就证明你这个应用程序肯定是植入病毒了(文件损坏的几率很低),那么你就应该赶紧删除,不应该安装此应用程序。
    • 我们之前说过,md5计算的就是bytes类型的数据的转换值,同一个bytes数据用同样的加密方式转化成的结果一定相同,如果不同的bytes数据(即使一个数据只是删除了一个空格)那么用同样的加密方式转化成的结果一定是不同的。所以,hashlib也是验证文件一致性的重要工具。

    • 文件校验实例:

      import hashlib
      
      def file_check(file_path):
      with open(file_path,mode='rb') as f1:
      sha256 = hashlib.md5()
      while 1:
      content = f1.read(1024)
      if content:
      sha256.update(content)
      else:
      return sha256.hexdigest()
      print(file_check('python-3.6.8-amd64.exe'))

(三)collections模块

  • collections模块提供了一些额外的数据类型和一些集合类的操作
  1. 之前提到过的官方判断可迭代对象和迭代器的方法:Iterable、Iterator

    from collections import Iterable, Iterator
    
    lst = [1,2,3,4,5]
    l_iter = iter(lst)
    print(isinstance(lst, Iterable))
    print(isinstance(l_iter, Iterator)) 运行结果:
    True
    True
  2. Counter类(统计)

    • Counter类是一个计数器,可以用来统计每个元素出现的次数,返回的是一个Counter对象
    from collections import Counter
    
    lst = [1, 2, 6, 2, 4, 4, 6, 2, 4, 5, 4, 4, 2, 3, 2, 1]
    print(dict(Counter(lst))) 运行结果:
    {1: 2, 2: 5, 6: 2, 4: 5, 5: 1, 3: 1}
    • Counter还可以用来去重
    from collections import Counter
    
    lst = [1, 2, 6, 2, 4, 4, 6, 2, 4, 5, 4, 4, 2, 3, 2, 1]
    print(list(Counter(lst))) 运行结果:
    [1, 2, 6, 4, 5, 3]
  3. deque类(双向队列)

    • deque类是一个双向队列,在双向队列之前先了解一下 队列 的定义

      • 栈:FILO 先进后出(比如上下电梯轿厢)
      • 队列:FIFO 先进先出(所有的排队)
    • 利用deque类来建立双向队列,以及操作双向队列
    from collections import deque
    
    q = deque()
    q.append(3)
    q.append(4)
    q.appendleft(2)
    q.appendleft(1)
    print(list(q))
    print(q.pop())
    print(q.popleft())
    print(list(q)) 运行结果:
    [1, 2, 3, 4]
    4
    1
    [2, 3]
  4. OrderedDict类(有序字典)

    • 顾名思义,通过OrderedDict类创建的字典是有序的
    from collections import OrderedDict
    
    dic = {"k1": 1, "k2": 2, "k3": 3}
    print(dic)
    od = OrderedDict({"k1": 1, "k2": 2, "k3": 3})
    print(od)
    print(od["k1"]) 运行结果:
    {'k1': 1, 'k2': 2, 'k3': 3}
    OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]) # 位置固定
    1 # 可以像正常字典取值
  5. defaultdict类(默认字典)

    • 通过defaultdict类创建的字典可以给字典设置默认值,当key不存在时,直接获取默认值
    from collections import defaultdict
    
    df = defaultdicr(list)
    print(df["k1"]) 运行结果:
    []
  6. namedtuple类(命名元组)

    • 通过namedtuple类创建元组可以给元组内的元素命名
    from collections import namedtuple
    
    nt = namedtuple("num", ["x", "y"])  # 定义元组名、元素名(其实这里是创建了一个类)
    p = nt(1, 2)
    print(p)
    print(p.x)
    print(p.y) 运行结果:
    num(x=1, y=2)
    1
    2

二、软件开发规范

  • 软件开发规范:分文件管理,增强耦合性

  • bin 启动文件目录
    lib 公共组件目录
    core 主逻辑目录
    db 相关数据目录
    log 日志
    conf 配置文件目录

Python基础(十六)的更多相关文章

  1. Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery

    PyQuery:一个类似jquery的python库 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 BeautifulSoup 美味 ...

  2. Python 爬虫十六式 - 第七式:正则的艺术

    RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...

  3. Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤

    BeautifulSoup 美味的汤 学习一时爽,一直学习一直爽!    Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 Xpath 的使用方法.Xpath 我觉得还是 ...

  4. Python 爬虫十六式 - 第一式:HTTP协议

    HTTP:伟大而又无闻的协议 学习一时爽,一直学习一直爽!   Hello,大家好啊,我是Connor,一个从无到有的技术小白.有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协 ...

  5. Bootstrap<基础十六> 导航元素

    Bootstrap 提供的用于定义导航元素的一些选项.它们使用相同的标记和基类 .nav.Bootstrap 也提供了一个用于共享标记和状态的帮助器类.改变修饰的 class,可以在不同的样式间进行切 ...

  6. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  7. Python基础知识(六)------小数据池,集合,深浅拷贝

    Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: ​ 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : ​ 一个文 ...

  8. Python爬虫十六式 - 第四式: 使用Xpath提取网页内容

    Xpath:简单易用的网页内容提取工具 学习一时爽,一直学习一直爽 !   Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 requests 的使用方法.到上节课为止, ...

  9. Python爬虫十六式 - 第三式:Requests的用法

    Requests: 让 HTTP 服务人类 学习一时爽,一直学习一直爽   Hello,大家好,我是Connor,一个从无到有的技术小白.今天我们继续来说我们的 Python 爬虫,上一次我们说到了 ...

  10. Python 爬虫十六式 - 第二式:urllib 与 urllib3

    Python请求标准库 urllib 与 urllib3 学习一时爽,一直学习一直爽!   大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了什么是HTTP协议,那么这一次我们就要动 ...

随机推荐

  1. 一行js代码实现时间戳转时间格式

    javascript时间戳转换,支持自定义格式,可以显示年,月,周,日,时,分,秒多种形式的日期和时间. 推荐一个JavaScript常用函数库 jutils jutils - JavaScript常 ...

  2. net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 哈哈哈哈,大家好,我就是那个高产似母猪的三合,长久以来,我一直在思考,如何才能实现高效而简洁的仓储模式 ...

  3. vue路由菜单权限设置就button权限设置

    路由权限的设计思路: 首先,我们的需要校验权限的路由的 url,全部由后端返回,后端会返回当前用户的路由树数组.前端在进入页面前请求接口,把数据拿到: 其次,前端会维护一个路由映射组件的列表,如果路由 ...

  4. JMeter更改语言为英文

    1. 进入目录apache-jmeter-2.13\bin 2. 打开jmeter.properties 3. 取消“language=en”前的注释 4. 重新打开JMeter,即可看到语言已经变成 ...

  5. 基于WFST的语音识别解码器

    学习语音识别有些时间了.老板要求我们基于Kaldi搭一个语音识别系统,在设备上通过MIC讲话,连着设备的PC的console上就能基本实时显示出讲话的内容.由于我们都是小白,刚开始可以要求低些,就用传 ...

  6. 良许 | 听说,有个同事因为关闭服务器被打进 ICU ……

    提问:你是如何关闭电脑的? 普通青年 文艺青年 二逼青年 你是属于哪一种呢? 实话说, 这三种良许都干过~ 还好我没有对服务器这么做, 否则-- 分分钟被打进 ICU -- 1. 关机命令知多少 对于 ...

  7. 结合生活案例实现rabbitmq消息通信

    title: 基于springboot实现rabbitmq消息通信 date: 2019-09-11 09:00:30 tags: - [rabbitmq] categories: - [spring ...

  8. Go语言基础之并发

    并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天) ...

  9. 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理

    0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...

  10. FreeSql (二十一)查询返回数据

    FreeSql 采用 ExpressionTree 优化读取速读,如果懂技术的你一定知道 .NETCore 技术下除了原生代码,最快就是 Emit 和 ExpressionTree. 项目在初期使用的 ...