zoukankan      html  css  js  c++  java
  • 15.Python略有小成(内置模块Ⅰ)

    Python(内置模块Ⅰ)

    一、序列化模块(很重要)

    序列化 : 将一种数据结构(,list,dict...),转化成一个特殊的字符串的过程

    我们现在要解决的问题 : 如果有一种特殊的字符串,这个字符串可以与任何的数据结构互相转换.

    序列化模块 : 将一种数据结构转化成特殊的序列(特殊的字符串,bytes)并且还可以翻转回去.

    二、json与pickle模块

    json模块 : 是所有语言公认的一种序列,但是支持的python数据结构有限(int str bool dict list (tuple),None float),
    json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去

    json序列化 两对四个方法

    1. dumps loads : 主要用于网络传输

      import json
      dic = {'k1':'v1','k2':'v2','k3':'v3'}
      str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
      print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
      #注意,json转换完的字符串类型的字典中的字符串是由""表示的
      
      dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
      #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
      print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
      
      list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
      str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
      print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
      list_dic2 = json.loads(str_dic)
      print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
      
    2. dump load : 单个数据的存取文件

      import json
      f = open('json_file.json','w')
      dic = {'k1':'v1','k2':'v2','k3':'v3'}
      json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
      f.close()
      # json文件也是文件,就是专门存储json字符串的文件。
      f = open('json_file.json')
      dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
      f.close()
      print(type(dic2),dic2)
      

    json序列化存储多个数据到同一个文件中

    dic1 = {'name':'boy1'}
    dic2 = {'name':'boy2'}
    dic3 = {'name':'boy3'}
    f = open('序列化',encoding='utf-8',mode='a')
    str1 = json.dumps(dic1)
    f.write(str1+'
    ')
    str2 = json.dumps(dic2)
    f.write(str2+'
    ')
    str3 = json.dumps(dic3)
    f.write(str3+'
    ')
    f.close()
    
    f = open('序列化',encoding='utf-8')
    for line in f:
        print(json.loads(line))
    

    pickle模块 : pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去,只能python语言中使用的,支持所有的puthon数据类型以及模块
    pickle序列化 两对四个方法

    1. dumps loads : 只能是网络传输

      import pickle
      dic = {'k1':'v1','k2':'v2','k3':'v3'}
      str_dic = pickle.dumps(dic)
      print(str_dic)  # bytes类型
      
      dic2 = pickle.loads(str_dic)
      print(dic2)    #字典
      
      # 还可以序列化对象
      import pickle
      
      def func():
          print(666)
          
      ret = pickle.dumps(func)
      print(ret,type(ret))  # b'x80x03c__main__
      func
      qx00.' <class 'bytes'>
      
      f1 = pickle.loads(ret)  # f1得到 func函数的内存地址
      f1()  # 执行func函数
      
    2. dump load : 只能用于文件写读,用wb rb ab 来处理文件

      dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
      f = open('pick序列化',mode='wb')
      pickle.dump(dic,f)
      f.close()
      with open('pick序列化',mode='wb') as f1:
          pickle.dump(dic,f1)
      

    pickle序列化存储多个数据到一个文件中

    dic1 = {'name':'oldboy1'}
    dic2 = {'name':'oldboy2'}
    dic3 = {'name':'oldboy3'}
    
    f = open('pick多数据',mode='wb')
    pickle.dump(dic1,f)
    pickle.dump(dic2,f)
    pickle.dump(dic3,f)
    f.close()
    
    f = open('pick多数据',mode='rb')
    while True:
        try:
            print(pickle.load(f))
        except EOFError:
            break
    f.close()
    

    三、os模块

    目录 : 文件夹
    工作目录,当前目录,父级目录

    单独学习 : __ file __动态获取当前文件的绝对路径

    • 当前执行这个python文件的工作目录相关的工作路径

      os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径  ***
      os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd  **
      os.curdir  返回当前目录: ('.')  **
      os.pardir  获取当前目录的父目录字符串名:('..') **
      
    • 和文件夹相关

      os.makedirs() : 批量新建多级目录(文件)可生成多层递归目录***
      os.removedirs() : 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推***
      os.mkdir("abc") : 创建单级目录(文件)***
      os.rmdir("abc") : 删除单级的目录(文件),当文件内有其他内容时,不会删除***
      os.listdir(r"D:s123") : 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印**
      
    • path与路径相关***

      os.path.abspath(path) 返回path规范化的绝对路径  ***
      os.path.split(path) 将path分割成目录和文件名二元组返回 ***
      os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素  **
      os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 **
      os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False  ***
      os.path.isabs(path)  如果path是绝对路径,返回True  **
      os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False  ***
      os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False  ***
      os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 ***
      os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间  **
      os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间  **
      os.path.getsize(path) 返回path的大小 ***
      
    • 注意 : os.stat('path/filename') 获取文件/目录信息 的结构说明

      stat 结构:
      st_mode: inode 保护模式
      st_ino: inode 节点号。
      st_dev: inode 驻留的设备。
      st_nlink: inode 的链接数。
      st_uid: 所有者的用户ID。
      st_gid: 所有者的组ID。
      st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
      st_atime: 上次访问的时间。
      st_mtime: 最后一次修改的时间。
      st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
      

    四、sys模块

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

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

    五、hashlib模块

    ​ 此模块有人称为摘要算法,也叫做加密算法,或者是哈希算法,散列算法等等,它通过一个函数,把任意长度的数据按照一定规则转换为一个固定长度的数据串(通常用16进制的字符串表示),它是一堆加密的算法的集合

    hashlib的特征以及使用要点:

    1. bytes类型数据 ---> 通过hashlib算法 ---> 固定长度的字符串
    2. 不同的bytes类型数据转化成的结果一定不同。
    3. 相同的bytes类型数据转化成的结果一定相同。
    4. 此转化过程不可逆。

    hashlib的主要用途有两个:

    1. 密码的加密

      我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

      import hashlib
      
      md5 = hashlib.md5()
      md5.update('123456'.encode('utf-8'))
      print(md5.hexdigest())
      
      # 计算结果如下:
      'e10adc3949ba59abbe56e057f20f883e'
      
      # 验证:相同的bytes数据转化的结果一定相同
      import hashlib
      
      md5 = hashlib.md5()
      md5.update('123456'.encode('utf-8'))
      print(md5.hexdigest())
      
      # 计算结果如下:
      'e10adc3949ba59abbe56e057f20f883e'
      
      # 验证:不相同的bytes数据转化的结果一定不相同
      import hashlib
      
      md5 = hashlib.md5()
      md5.update('12345'.encode('utf-8'))
      print(md5.hexdigest())
      
      # 计算结果如下:
      '827ccb0eea8a706c4c34a16891f84e7b'
      

      加盐加密

      • 固定的盐

        ret = hashlib.md5('xx流派'.encode('utf-8'))  # xx流派就是固定的盐
        ret.update('a'.encode('utf-8'))
        print(ret.hexdigest())
        
      • 动态的盐

        username = '九阴真经'
        ret = hashlib.md5(username[::2].encode('utf-8'))  # 针对于每个账户,每个账户的盐都不一样
        ret.update('a'.encode('utf-8'))
        print(ret.hexdigest())
        

      但是对安全要求比较高的企业,比如金融行业,MD5加密的方式就不够了,得需要加密方式更高的,比如sha系列sha1,sha224,sha512等等,数字越大,加密的方法越复杂,安全性越高,但是效率就会越慢。

      # sha系列 : 安全系数高,耗时高
      ret = hashlib.sha1()
      ret.update('jiuyinzhenjing'.encode('utf-8'))
      print(ret.hexdigest())
      
      #也可加盐
      ret = hashlib.sha384(b'asfdsa')
      ret.update('jiuyinzhenjing'.encode('utf-8'))
      print(ret.hexdigest())
      
      # 也可以加动态的盐
      ret = hashlib.sha384(b'asfdsa'[::2])
      ret.update('jiuyinzhenjing'.encode('utf-8'))
      print(ret.hexdigest())
      
    2. 文件一致性校验

      linux讲究:一切皆文件,我们普通的文件,是文件,视频,音频,图片,以及应用程序等都是文件.

      我们的网络世界是很不安全的,经常会遇到病毒,木马等,md5计算的就是bytes类型的数据的转换值,同一个bytes数据用同样的加密方式转化成的结果一定相同,如果不同的bytes数据(即使一个数据只是删除了一个空格)那么用同样的加密方式转化成的结果一定是不同的。所以,hashlib也是验证文件一致性的重要工具。

      运用所学过的函数知识,做一个可以检验文件md5的方式如下

      def file_check(file_path):
          with open(file_path,mode='rb') as f1:
              sha256 = hashlib.sha256()
              while 1:
                  content = f1.read(1024)
                  if content:
                      sha256.update(content)
                  else:
                      return sha256.hexdigest()
      print(file_check('pycharm-professional-2019.1.1.exe'))
      
  • 相关阅读:
    1.Lucene
    docker 安装常用服务
    docker 常用命令
    05-vue中使用样式
    04-vue的事件修饰符
    03-用基本指令实现跑马灯效果
    02-vue基本指令
    01-vue分层概念MVVM
    Redis-持久化机制
    BigDecimal工具类
  • 原文地址:https://www.cnblogs.com/chenshuo531702820/p/11099349.html
Copyright © 2011-2022 走看看