• 模块的再学习


    1. 前奏

      l1 = [1, 2, 3]
      ret = str(l1)
      print(ret,type(ret))
      print(eval(ret))   不让用
      文件存取时,遇到的矛盾.
      
      dic ={'username': '太白', 'password': 123}
      
      dic = {1: {'username': '太白', 'password': 123,'status': False},
      		2:{'username': 'alex', 'password': 123,'status': False}}
      
      这个字典能放在全局么?
      with open('register.json',encoding='utf-8',mode='w') as f1:
           f1.write(str(dic))
      with open('register',encoding='utf-8') as f1:
           ret = f1.read()
           print(ret,type(ret))
      
      数据结构 --- > str() 字符串形式存储在文件当中, 读取出来时,反转不回去.
      
      网络传输.(凡是数据通过网络传出去最终的格式必须bytes)
      l1 = [i for i in range(100000)]
      凡是数据通过网络传出去最终的格式必须bytes
      s1 = str(l1)
      b1 = s1.encode('utf-8')
      print(b1)   b1可以发送出去
      
      s2 = b1.decode('utf-8')
      print(s2,type(s2))
      s2 转化不成列表了.
      
      我们现在要解决的问题: 如果有一种特殊的字符串,这个字符串可以与任何的数据结构互相转换.
      
    2. 序列化模块(序列化模块: 将一中数据结构转化成特殊的序列(特殊的字符串,bytes)并且还可以反转回去.)

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

      • json模块:json模块: 是所有语言公认的一种序列.最最常用的所以支持的python数据结构有限: int str bool dict list(tuple),None,float

      • 两对四个方法:

        1. dumps,loads 主要用于网络传输,可以用于文件的存取.

          import json
          dumps,loads 主要用于网络传输,可以用于文件的存取.
          dic = {'username': '太白', 'password': 123,'status': False}
          ret = json.dumps(dic)
          print(ret,type(ret))
          
          ret_dict = json.loads(ret)
          print(ret_dict)
          
          特殊的参数
          dic = {'username': '太白', 'password': 123,'status': False}
          print(dic)
          
          ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
          print(ret,type(ret))
          
          import json
          dic = {'username': '太白', 'password': 123,'status': False}
          s_dict = json.dumps(dic)
          with open('jsonlx.json',encoding='utf-8',mode='w') as f1:
               f1.write(s_dict)
          
          with open('jsonlx.json',encoding='utf-8') as f2:
               content = f2.read()
               print(json.loads(content))
          
        2. dump load: 单个数据的存取文件.

           dump load: 单个数据的存取文件.
          
           import json
           dic = {'username': '太白', 'password': 123,'status': False}
           with open('jsonlx1.json',encoding='utf-8',mode='w') as f1:
               json.dump(dic,f1)
          
          
           with open('jsonlx1.json',encoding='utf-8') as f1:
               dic1 = json.load(f1)
           print(dic1,type(dic1))
           
          
        3. 多个数据如何存储到一个文件中?

          多个数据如何存储到一个文件中?
          错误演示:
          import json
          dic1 = {'username': '太白', 'password': 123,'status': False}
          dic2 = {'username': 'alex', 'password': 123,'status': False}
          dic3 = {'username': 'ly', 'password': 123,'status': False}
          with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
                f1.write(json.dumps(dic1))
                f1.write(json.dumps(dic2))
                f1.write(json.dumps(dic3))
                f1.write(f'{json.dumps(dic1)}{json.dumps(dic2)}{json.dumps(dic3)}')
          
          
          with open('jsonmore.json',encoding='utf-8') as f1:
               ret = json.loads(f1.read())
               print(ret)
               
          正确做法:
          import json
          dic1 = {'username': '太白', 'password': 123,'status': False}
          dic2 = {'username': 'alex', 'password': 123,'status': False}
          dic3 = {'username': 'ly', 'password': 123,'status': False}
          with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
               f1.write(f'{json.dumps(dic1)}
          {json.dumps(dic2)}
          {json.dumps(dic3)}')
          
          with open('jsonmore.json',encoding='utf-8') as f1:
               for line in f1:
                   ret = json.loads(line)
                   print(ret,type(ret))
          
      • pickle模块:pickle模块: 只能python语言中使用的,序列化模块:支持python所有的数据类型以及对象.

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

          l1 = ['wusir', '太白', '小黑', 666]
          ret = pickle.dumps(l1)
          	print(ret)
          
          l2 = pickle.loads(ret)
          print(l2,type(l2))
          
        2. dump load 数据结构存取文件.

          dump load 数据结构存取文件.
          import pickle
          l1 = ['wusir', '太白', '小黑', 666]
          with open('pickle练习.pickle',mode='wb') as f1:
          	pickle.dump(l1,f1)
          
          
          with open('pickle练习.pickle', mode='rb') as f1:
          	ret = pickle.load(f1)
          	print(ret,type(ret))
          
        3. 多个数据写入文件

          l1 = ['wusir', '太白', '小黑1', 666]
          l2 = ['wusir', '太白', '小黑2', 666]
          l3 = ['wusir', '太白', '小黑3', 666]
          with open('pickle练习1.pickle',mode='wb') as f1:
          	pickle.dump(l1,f1)
          	pickle.dump(l2,f1)
          	pickle.dump(l3,f1)
          
          with open('pickle练习1.pickle', mode='rb') as f1:
               ret1 = pickle.load(f1)
               ret2 = pickle.load(f1)
               ret3 = pickle.load(f1)
               print(ret1,ret2,ret3)
          
      • shevle模块(只能是文件存取)

    3. os模块

      • 目录:文件夹

      • 工作目录,当前目录,父级目录: day17

        • import os
           print(os.getcwd())   D:s23day17 绝对路径  ***
           os.chdir(r'D:s23day9')
           print(os.getcwd())
           print(os.curdir)
           print(os.pardir)
          
      • h和文件相关的

        • import os
           os.makedirs('dirname1/dirname2/dirname3/dirname4')   多级目录
           os.removedirs('dirname1/dirname2/dirname3/dirname4')  截止到有文件的那层
           os.mkdir(r'd:abc')  单级目录
           os.rmdir('abc')
           print(os.listdir(r'D:s23day15'))
          
          
           os.remove()  删除一个文件  ***
           os.rename("oldname","newname")  重命名文件/目录  ***
           print(os.stat(r'D:s23day171 昨日内容回顾.py'))
          
      • path 和路径相关

        • path 和路径相关  ***
          print(os.path.abspath('04 os模块.py'))   D:s23day171 昨日内容回顾.py
          print(os.path.split(os.path.abspath('01 昨日内容回顾.py')))   ('D:\s23\day17', '01 昨日内容回顾.py')
          print(os.path.dirname(r'D:s23day91 初始函数.py'))   获取父级目录
          print(os.path.dirname(os.path.abspath('01 昨日内容回顾.py')))
          print(__file__)   动态获取当前文件的绝对路径
          获取当前文件的爷爷级的目录
          print(os.path.dirname(os.path.dirname(__file__)))
          print(os.path.basename(r'D:s23day91 初始函数.py'))   获取文件名
          print(os.path.exists(r'D:s23day92 初始函数.py'))
          判断是否是绝对路径
          print(os.path.isabs(r'D:s23day91 初始函数.py'))
          print(os.path.isabs(r'day17/01 昨日内容回顾.py'))
          判断该路径是否是一个文件路径
          print(os.path.isfile(r'D:s23day91 初始函数.py'))
          print(os.path.isfile(r'D:s23day9'))
          print(os.path.isdir(r'D:s23day17dirname1dirname2'))
          print(os.path.exists(r'D:s23day17dirname1dirname2'))
          判断是否是一个目录(文件夹)
          print(os.path.isdir(r'D:s23day172 序列化模块.py'))
          D:s23day16评论文章
          path = os.path.join('D:','s23','day20','随便')
          print(path)
          par_dir = os.path.dirname(__file__)
          print(par_dir)   D:/s23/day17
          path = r'D:s23day17dblydata'
          path = par_dir + 'db' +'lydata'
          path = os.path.join(par_dir,'db','lydata')
          with open(path,encoding='utf-8',mode='a') as f1:
              f1.write('李业在红浪漫消费998元')
            
          print(os.path.getatime('D:s23day17dblydata'))
          print(os.path.getmtime('D:s23day17dblydata'))
          print(os.path.getsize('D:s23day17dblydata'))
            
          print(os.stat(r'D:s23day171 昨日内容回顾.py'))
          
      • sys模块(sys.path )

        • import sys
          sys.path  ***
          print(sys.version)   版本
          
          for i in range(3):
               print(i)
          exit()   强制退出
          quit()
          for i in range(5):
              print(i)
          print(sys.platform)
          
      • hashlib模块

        • 加密模块, 摘要算法,散列算法,等等.它是一堆加密算法的集合.

          liye|zmdsb
          太白|123
          

          明文形式存储的,带来安全隐患

        • hashlib如何加密?

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

        • hashlib用途

          1. 密码加密.
          2. 文件一致性校验.
          
        • 密码加密

          密码加密
           md5
           ret = hashlib.md5()
           ret.update('123'.encode('utf-8'))
           s = ret.hexdigest()
           print(s,type(s))
          
           ret = hashlib.md5()
           ret.update('123'.encode('utf-8'))
           s = ret.hexdigest()
           print(s,type(s))
          
           ret = hashlib.md5()
           ret.update('223'.encode('utf-8'))
           s = ret.hexdigest()
           print(s,type(s))
          
           ret = hashlib.md5()
           ret.update('22fdslkafjdsklfdsjalfaklfjdslkfjdslkfjdsalf;dsajkfldsjf3'.encode('utf-8'))
           s = ret.hexdigest()
           print(s,type(s))
          
        • 撞库

           ret = hashlib.md5()
           ret.update('123456*@qwe'.encode('utf-8'))
           s = ret.hexdigest()
           print(s,type(s))
          
        • 加固定盐

           ret = hashlib.md5('xxx教育'.encode('utf-8'))
           ret.update('123456'.encode('utf-8'))
           s = ret.hexdigest()
           print(s,type(s))
          
        • 加动态的盐

           username = input('输入用户名:').strip()
           password = input('输入密码').strip()
           ret = hashlib.md5(username[::2].encode('utf-8'))
           ret.update(password.encode('utf-8'))
           s = ret.hexdigest()
           print(s)
          
        • sha系列: 安全系数高,耗时高.

          加盐,加动态盐
          ret = hashlib.sha512()
          ret.update('123456fdklsajflsdfjsdlkafjafkl'.encode('utf-8'))
          s = ret.hexdigest()
          print(s,type(s))
          
      • 文件的一致性校验:

        low版
         import hashlib
         ret = hashlib.md5()
         with open('MD5文件校验',mode='rb') as f1:
             content = f1.read()
             ret.update(content)
         print(ret.hexdigest())
        
         ret = hashlib.md5()
         with open('MD5文件校验1',mode='rb') as f1:
             content = f1.read()
             ret.update(content)
         print(ret.hexdigest())
        
         ret = hashlib.md5()
         with open(r'D:s23day17python-3.7.4rc1-embed-win32.zip',mode='rb') as f1:
             content = f1.read()
             ret.update(content)
         print(ret.hexdigest())
         d9c18c989c474c7629121c9d59cc429e
         d9c18c989c474c7629121c9d59cc429e
        

        分布update

         s1 = '老男孩教育 最好的python 讲师 是 太白'
           1
         ret = hashlib.md5()
         ret.update(s1.encode('utf-8'))
         print(ret.hexdigest())
        
        
          2
         ret = hashlib.md5()
         ret.update('老男孩教育'.encode('utf-8'))
         ret.update(' 最好的python'.encode('utf-8'))
         ret.update(' 讲师 是'.encode('utf-8'))
         ret.update(' 太白'.encode('utf-8'))
         print(ret.hexdigest())   90c56d265a363292ec70c7074798c913
        
        
        高达上版
        import hashlib
        def md5_file(path):
            ret = hashlib.md5()
            with open(path,mode='rb') as f1:
                while 1:
                    content = f1.read(1024)
                    if content:
                        ret.update(content)
                    else:
                        return ret.hexdigest()
        
        
        print(md5_file(r'D:s23day17python-3.7.4rc1-embed-win32.zip'))
  • 相关阅读:
    Jqgrid学习
    【转】SpringMVC 流程图
    【转】spring学习之@SessionAttributes
    【转】HttpSessionListener, HttpSessionAttributeListener的用法
    Java会话(session)管理
    hibernate--一对多xxx.hbm.xm配置
    使用Spring容器
    最简单的hibernate入门、配置
    搭建Struts 2的工作环境
    Struts2的常用标签
  • 原文地址:https://www.cnblogs.com/-777/p/11099317.html
Copyright © 2020-2023  润新知