zoukankan      html  css  js  c++  java
  • python模块---常用模块2

    1. ## 今日内容大纲
    
    
    
       1. 自定义模块
       2. 模块是什么?
       3. 为什么要有模块?
          + 什么是脚本?
       4. 模块的分类
       5. import的使用
          + 第一次导入模块执行三件事
          + 被导入模块有独立的名称空间
          + 为模块起别名
          + 导入多个模块
       6. from ... import ...
          + from ... import ...的使用
          + from ... import ... 与import对比
          + 一行导入多个
          + from ... import *
          + 模块循环导入的问题
          + py文件的两种功能
          + 模块的搜索路径
       7. json pickle 模块
       8. hashlib模块
    
    2. ## 具体内容
    
       1. 自定义模块
    
       2. 模块是什么?
    
          抖音: 20万行代码全部放在一个py文件中?
    
          为什么不行? 
    
              1. 代码太多,读取代码耗时太长.
    
                 2. 代码不容易维护.
    
          所以我们怎么样?
    
          一个py文件拆分100文件,100个py文件又有相似相同的功能.冗余. 此时你要将100个py文件中相似相同的函数提取出来, input 功能,print()功能, time.time() os.path.....放在一个文件,当你想用这个功能拿来即用.类似于这个py文件: 常用的相似的功能集合.模块.
    
          模块就是一个py文件常用的相似的功能集合.
    
       3. 为什么要有模块?
    
          + 拿来主义,提高开发效率.
          + 便于管理维护.
    
          - 什么是脚本?
            - 脚本就是py文件.长期保存代码的文件.
    
       4. 模块的分类
    
          1. 内置模块200种左右.Python解释器自带的模块,time os sys hashlib等等.
    
          2. 第三方模块6000种.一些大牛大神写的,非常好用的. 
    
             pip install 需要这个指令安装的模块,Beautiful_soup,request,Django,flask 等等.
    
          3. 自定义模块,自己写的一个py文件.
    
       5. import的使用
    
          import 模块 先要怎么样?
    
          import tbjx  执行一次tbjx这个模块里面的所有代码,
    
          第一次引用tbjx这个模块,会将这个模块里面的所有代码加载到内存,只要你的程序没有结束,接下来你在引用多少次,它会先从内存中寻找有没有此模块,如果已经加载到内存,就不在重复加载.
    
          - 第一次导入模块执行三件事  `***`
    
            - 1. 在内存中创建一个以tbjx命名的名称空间.
    
              2. 执行此名称空间所有的可执行代码(将tbjx.py文件中所有的变量与值的对应关系加载到这个名称空间).
    
              3. 通过tbjx. 的方式引用模块里面的代码.
    
                 ```python
                 import tbjx
                 print(tbjx.name)
                 tbjx.read1()
                 
                 ```
    
                 ![1558409649013](C:UsersoldboyAppDataRoamingTypora	ypora-user-images1558409649013.png)
    
          - 被导入模块有独立的名称空间   `***`
    
            ```python
            import tbjx
            # name = 'alex'
            # print(name)
            # print(tbjx.name)
            
            #
            # def read1():
            #     print(666)
            # tbjx.read1()
            #
            
            # name = '日天'
            # tbjx.change()
            # print(name)  # 日天
            # print(tbjx.name)  # barry
            ```
    
            ![1558409673492](C:UsersoldboyAppDataRoamingTypora	ypora-user-images1558409673492.png)
    
            ![1558409693895](C:UsersoldboyAppDataRoamingTypora	ypora-user-images1558409693895.png)
    
          - 为模块起别名  ` **`
    
            - 1 简单,便捷.
    
              ```python 
              # import hfjksdahdsafkd as sm
              # print(sm.name)
              ```
    
              
    
            - 2,有利于代码的简化.
    
              ```python
              # 原始写法
              # result = input('请输入')
              # if result == 'mysql':
              #     import mysql1
              #     mysql1.mysql()
              # elif result == 'oracle':
              #     import oracle1
              #     oracle1.oracle()
              # list.index()
              # str.index()
              # tuple.index()
              # 起别名
              # result = input('请输入')
              # if result == 'mysql':
              #     import mysql1 as sm
              # elif result == 'oracle':
              #     import oracle1 as sm
              # ''' 后面还有很多'''
              # sm.db()  # 统一接口,归一化思想
              ```
    
              
    
          - 导入多个模块
    
            ```python
            import time, os, sys  # 这样写不好
            # 应该向以下这种写法:
            import time
            import os
            import sys
            ```
    
            
    
       6. from ... import ...
    
          - from ... import ...的使用
    
            ```python
            # from tbjx import name
            # from tbjx import read1
            # from tbjx import read2
            # print(name)
            # print(globals())
            # read1()
            ```
    
            
    
          - from ... import ... 与import对比  `***`
    
            1. from.. import 用起来更方便
    
               ```python
               from tbjx import name
               print(name)
               ```
    
               
    
            2. from...import 容易与本文件的名字产生冲突.
    
               ```python
               # 1, 容易产生冲突,后者将前者覆盖
               # name = 'alex'
               # from tbjx import name
               # print(name)
               
               ```
    
            3. 当前位置直接使用read1和read2,执行时,仍然以tbjx.py文件全局名称空间  `***`
    
               ```python
               # from tbjx import read1
               #
               # def read1():
               #     print(666)
               
               # name = '大壮'
               # read1()
               # print(globals())
               
               
               from tbjx import change
               name = 'Alex'
               print(name)  # 'Alex'
               change()  # 'barry'
               from tbjx import name
               print(name)
               
               
               ```
    
               
    
          - 一行导入多个
    
            ```python
            from tbjx import name,read1,read2  # 这样不好
            from tbjx import name
            from tbjx import read1
            ```
    
            
    
          - from ... import *
    
          - 模块循环导入的问题
    
            
    
          - py文件的两种功能
    
            py文件的两个功能:
    
            1. 自己用 脚本
            2. 被别人引用 模块使用
    
            ```python
            
            ```
    
         # print('from the tbjx.py')
    
            __all__ = ['name', 'read1']  # 配合*使用
             
            name = '太白金星'
             
            def read1():
                print('tbjx模块:', name)
    
         def read2():
                print('tbjx模块')
                read1()
            
    
            def change():
                global name
                name = 'barry'
                print(name)
    
    
       ​     
       ​     
    
            # print(__name__)
            # 当tbjx.py做脚本: __name__ == __main__  返回True
            # 当tbjx.py做模块被别人引用时: __name__ == tbjx
            
            # __name__ 根据文件的扮演的角色(脚本,模块)不同而得到不同的结果
            #1, 模块需要调试时,加上 if __name__ == '__main__':
            # import time
            
            # change()  # 测试代码
            # if __name__ == '__main__':
            #     change()
            
            # 2, 作为项目的启动文件需要用.
            ```
    
    
       ​     
    
          - 模块的搜索路径  ` ***`
    
            ```python
            # import sm
            import abc
            # python 解释器会自动将一些内置内容(内置函数,内置模块等等)加载到内存中
            import sys
            # print(sys.modules)  # 内置内容(内置函数,内置模块等等)
            import time
            
            # print(sys.path)
            #['D:\python_22\day17', 'C:\Python\Python36\python36.zip', 'C:\Python\Python36\DLLs', 'C:\Python\Python36\lib', 'C:\Python\Python36', 'C:\Python\Python36\lib\site-packages']
            # 'D:\python_22\day17' 路径是当前执行文件的相对路径
            # import tbjx
            
            # 我就想找到dz 内存没有,内置中,这两个你左右不了,sys.path你可以操作.
            import sys
            sys.path.append(r'D:python_22day16')
            # sys.path 会自动将你的 当前目录的路径加载到列表中.
            import dz
            
            # 如果你想要引用你自定义的模块:
            # 要不你就将这个模块放到当前目录下面,要不你就手动添加到sys.path
            
            ```
    
          - import sm
    
            1. 它会先从内存中寻找有没有已经存在的以sm命名的名称空间.
            2. 它会从内置的模块中找. time,sys,os,等等.
            3. 他从sys.path中寻找.
    
       7. json pickle 模块
    
    
       序列化模块: 将一种数据结构(list,tuple,dict ....)转化成特殊的序列.
    
       为什么存在序列化?
    
       数据  ----> bytes
    
       只有字符串类型和bytes可以互换.
    
       dict,list..... -------> str <--------> bytes  
    
       数据存储在文件中,str(bytes类型)形式存储,比如字典.
    
       数据通过网络传输(bytes类型),str 不能还原回去.
    
       特殊的字符串:序列化.
    
       序列化模块:
    
    ​    json模块 : (**重点**1. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
          2. json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None
    
    ​     
    
    ```python
    l1 = [i for i in range(10000)]
    # l1 --->bytes
    # b1 = l1.encode('utf-8')  # 不能直接转换
    # l1转化成字符串在转化成bytes
    s1 = str(l1)
    b1 = s1.encode('utf-8')
    # print(b1)
    
    # 岑哥接收了b1
    s2 = b1.decode('utf-8')
    # print(s2,type(s2))
    
    # str 我们学过的str
    
    # dic = {'username': '太白', 'password': 123,'status': True}
    import json
    #dumps loads 主要用于网络传输,但是也可以读写文件
    # 特殊的字符串
    # st = json.dumps(dic,ensure_ascii=False)
    # print(st,type(st))
    # # 反转回去
    # dic1 = json.loads(st)
    # print(dic1,type(dic1))
    
    # 写入文件
    # l1 = [1, 2, 3, {'name': 'alex'}]
    # 转化成特殊的字符串写入文件
    # with open('json文件',encoding='utf-8',mode='w') as f1:
    #     st = json.dumps(l1)
    #     f1.write(st)
    
    # 读取出来还原回去
    # with open('json文件',encoding='utf-8') as f2:
    #     st = f2.read()
    #     l1 = json.loads(st)
    #     print(l1,type(l1))
    # 特殊的参数
    l1 = [1, 2, 3, {'name': 'alex'}]
    
    # dump load 只能写入文件,只能写入一个数据结构
    # with open('json文件1',encoding='utf-8',mode='w') as f1:
    #     json.dump(l1,f1)
    
    # 读取数据
    # with open('json文件1',encoding='utf-8') as f2:
    #     l1 = json.load(f2)
    #     print(l1,type(l1))
    
    
    # 一次写入文件多个数据怎么做?
    
    # 错误示例:
    # dic1 = {'username': 'alex'}
    # dic2 = {'username': '太白'}
    # dic3 = {'username': '大壮'}
    # with open('json文件1',encoding='utf-8',mode='w') as f1:
    #     json.dump(dic1,f1)
    #     json.dump(dic2,f1)
    #     json.dump(dic3,f1)
    
    
    # 读取数据
    # with open('json文件1',encoding='utf-8') as f1:
    #     print(json.load(f1))
        # print(json.load(f1))
        # print(json.load(f1))
    
    
    # 正确写法:
    dic1 = {'username': 'alex'}
    dic2 = {'username': '太白'}
    dic3 = {'username': '大壮'}
    # with open('json文件1',encoding='utf-8',mode='w') as f1:
    #     f1.write(json.dumps(dic1) + '
    ')
    #     f1.write(json.dumps(dic2) + '
    ')
    #     f1.write(json.dumps(dic3) + '
    ')
    
    # with open('json文件1',encoding='utf-8') as f1:
    #     for i in f1:
    #         print(json.loads(i))
    
    
    
    ```
    
       ​    pickle模块:
    
    
    
          1. 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
          2. 支持Python所有的数据类型包括实例化对象。
    
       
    
    ```python
    l1 = [1, 2, 3, {'name': 'alex'}]
    
    # dumps loads 只能用于网络传输
    # import pickle
    # st = pickle.dumps(l1)
    # print(st)  # bytes
    #
    # l2 = pickle.loads(st)
    # print(l2,type(l2))
    
    # dump load 直接写入文件
    # import 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()
    # import pickle
    # f = open('pick多数据',mode='rb')
    # print(pickle.load(f))
    # print(pickle.load(f))
    # print(pickle.load(f))
    # f.close()
    
    import pickle
    def func():
        print('in func')
    
    # f = open('pick对象',mode='wb')
    # pickle.dump(func,f)
    # f.close()
    
    # f = open('pick对象', mode='rb')
    # ret = pickle.load(f)
    # print(ret)
    # ret()
    ```
    
       
    
       
    
       8. hashlib模块
    
          包含很多的加密算法. MD5, sha1 sha256 sha512......
    
          用途:
    
          1. 密码加密.不能以明文的形式存储密码.密文的形式.
          2. 文件的校验.
    
          
    
          用法:
    
          1. 将bytes类型字节 转化成 固定长度的16进制数字组成的字符串.
    
          2. 不同的bytes利用相同的算法(MD5)转化成的结果一定不同.
    
          3. 相同的bytes利用相同的算法(MD5)转化成的结果一定相同.
    
          4. hashlib算法不可逆(MD5中国王晓云破解了).
    
    ```python
    # import hashlib
    # hashlib.md5()
    
    # md5
    # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育'
    # import hashlib
    # ret = hashlib.md5()
    # ret.update(s1.encode('utf-8'))
    # print(ret.hexdigest(),)
    
    # 相关练习
    import hashlib
    # def MD5(pwd):
    #     ret = hashlib.md5()
    #     ret.update(pwd.encode('utf-8'))
    #     return ret.hexdigest()
    #
    #
    # def register():
    #     username = input('请输入用户名:').strip()
    #     password = input('请输入密码:').strip()
    #     password_md5 = MD5(password)
    #     with open('register',encoding='utf-8',mode='a') as f1:
    #         f1.write(f'
    {username}|{password_md5}')
    #
    # register()
    #
    # def login():
    #     username = input('请输入用户名:').strip()
    #     password = input('请输入密码:').strip()
    #     password_md5 = MD5(password)
    #
    
    # 普通加密
    
    import hashlib
    # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育'
    # s2 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育'
    # ret = hashlib.md5()
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 18f127c24462dd59287798ea5c0c0c2f  18f127c24462dd59287798ea5c0c0c2f
    # 123456:  18f127c24462dd59258898ea5c0c0c2f
    # 000000:  18f127c24462dd59258898we5c0c0c2f
    
    # s2 = '19890425'
    # ret = hashlib.md5()
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 6e942d04cf7ceeeba09e3f2c7c03dc44
    
    # 加盐
    
    # s2 = '19890425'
    # ret = hashlib.md5('太白金星'.encode('utf-8'))
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 84c31bbb6f6f494fb12beeb7de4777e1
    
    
    # 动态的盐
    # s2 = '19890425'
    # ret = hashlib.md5('太白金星'[::2].encode('utf-8'))
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 84c31bbb6f6f494fb12beeb7de4777e1
    
    
    # sha系列  金融类,安全类.用这个级别.
    # 随着sha系列数字越高,加密越复杂,越不易破解,但是耗时越长.
    # s2 = '198fdsl;fdsklgfjsdlgdsjlfkjsdalfksjdal90425'
    # ret = hashlib.sha3_512()
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 4d623c6701995c989f400f7e7eef0c4fd4ff15194751f5cb7fb812c7d42a7406ca0349ea3447d245ca29b48a941e2f2f66579fb090babb73eb2b446391a8e102
    
    
    
    # 文件的校验
    
    # linux中一切皆文件: 文本文件,非文本文件,音频,视频,图片....
    # 无论你下载的视频,还是软件(国外的软件),往往都会有一个md5值
    
    
    # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6  *pycharm-professional-2019.1.2.exe
    
    # s1 = '我叫太白金星 今年18岁'
    # ret = hashlib.sha256()
    # ret.update(s1.encode('utf-8'))
    # print(ret.hexdigest())  # 54fab159ad8f0bfc5df726a70332f111c2c54d31849fb1e4dc1fcc176e9e4cdc
    #
    # ret = hashlib.sha256()
    # ret.update('我叫'.encode('utf-8'))
    # ret.update('太白金星'.encode('utf-8'))
    # ret.update(' 今年'.encode('utf-8'))
    # ret.update('18岁'.encode('utf-8'))
    # print(ret.hexdigest()) # 54fab159ad8f0bfc5df726a70332f111c2c54d31849fb1e4dc1fcc176e9e4cdc
    
    # low版校验:
    def file_md5(path):
        ret = hashlib.sha256()
        with open(path,mode='rb') as f1:
            b1 = f1.read()
            # print(b1)
            ret.update(b1)
        return ret.hexdigest()
    result = file_md5('pycharm-professional-2019.1.2.exe')
    print(result)  # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6
    
    # 高大上版
    
    ```
    
    
    
    1. ## 今日总结
    
       1. import 三件事, import的名字如果调用? 模块名.的方式调用.
    
       2. from ... import ... 容易产生冲突,独立的空间.
    
       3. `__name__`问题
    
       4. 模块的搜索路径
    
          内存 内置 sys.path
    
       5. 序列化模块: 
    
          1. json最最常用(两对四个方法就行)  一定要掌握
          2. pickle(两对四个方法就行)  尽量掌握
    
       6. hashlib
    
          1. 密码的加密 ,文件的校验
    1. 今日内容大纲

      第一次班委会总结:

      • 微调座位.

      • 开展运维兴趣班.

      • 培养独立思考问题的能力.

        • 遇到难题 选做题:先思考20分钟左右.关键节点问问思路.

        •  

      1. 自定义模块

      2. 模块是什么?

      3. 为什么要有模块?

        • 什么是脚本?

      4. 模块的分类

      5. import的使用

        • 第一次导入模块执行三件事

        • 被导入模块有独立的名称空间

        • 为模块起别名

        • 导入多个模块

      6. from ... import ...

        • from ... import ...的使用

        • from ... import ... 与import对比

        • 一行导入多个

        • from ... import *

        • 模块循环导入的问题

        • py文件的两种功能

        • 模块的搜索路径

      7. json pickle 模块

      8. hashlib模块

    2. 具体内容

      1. 自定义模块

      2. 模块是什么?

        抖音: 20万行代码全部放在一个py文件中?

        为什么不行?

        1. 代码太多,读取代码耗时太长.
        1. 代码不容易维护.

        所以我们怎么样?

        一个py文件拆分100文件,100个py文件又有相似相同的功能.冗余. 此时你要将100个py文件中相似相同的函数提取出来, input 功能,print()功能, time.time() os.path.....放在一个文件,当你想用这个功能拿来即用.类似于这个py文件: 常用的相似的功能集合.模块.

        模块就是一个py文件常用的相似的功能集合.

      3. 为什么要有模块?

        • 拿来主义,提高开发效率.

        • 便于管理维护.

        • 什么是脚本?

          • 脚本就是py文件.长期保存代码的文件.

      4. 模块的分类

        1. 内置模块200种左右.Python解释器自带的模块,time os sys hashlib等等.

        2. 第三方模块6000种.一些大牛大神写的,非常好用的.

          pip install 需要这个指令安装的模块,Beautiful_soup,request,Django,flask 等等.

        3. 自定义模块,自己写的一个py文件.

      5. import的使用

        import 模块 先要怎么样?

        import tbjx 执行一次tbjx这个模块里面的所有代码,

        第一次引用tbjx这个模块,会将这个模块里面的所有代码加载到内存,只要你的程序没有结束,接下来你在引用多少次,它会先从内存中寻找有没有此模块,如果已经加载到内存,就不在重复加载.

        • 第一次导入模块执行三件事 ***

            1. 在内存中创建一个以tbjx命名的名称空间.

            2. 执行此名称空间所有的可执行代码(将tbjx.py文件中所有的变量与值的对应关系加载到这个名称空间).

            3. 通过tbjx. 的方式引用模块里面的代码.

              import tbjx
              print(tbjx.name)
              tbjx.read1()

               

        • 被导入模块有独立的名称空间 ***

          import tbjx
          # name = 'alex'
          # print(name)
          # print(tbjx.name)

          #
          # def read1():
          #     print(666)
          # tbjx.read1()
          #

          # name = '日天'
          # tbjx.change()
          # print(name) # 日天
          # print(tbjx.name) # barry

           

           

        • 为模块起别名 **

          • 1 简单,便捷.

            # import hfjksdahdsafkd as sm
            # print(sm.name)

             

          • 2,有利于代码的简化.

            # 原始写法
            # result = input('请输入')
            # if result == 'mysql':
            #     import mysql1
            #     mysql1.mysql()
            # elif result == 'oracle':
            #     import oracle1
            #     oracle1.oracle()
            # list.index()
            # str.index()
            # tuple.index()
            # 起别名
            # result = input('请输入')
            # if result == 'mysql':
            #     import mysql1 as sm
            # elif result == 'oracle':
            #     import oracle1 as sm
            # ''' 后面还有很多'''
            # sm.db() # 统一接口,归一化思想

             

        • 导入多个模块

          import time, os, sys  # 这样写不好
          # 应该向以下这种写法:
          import time
          import os
          import sys

           

      6. from ... import ...

        • from ... import ...的使用

          # from tbjx import name
          # from tbjx import read1
          # from tbjx import read2
          # print(name)
          # print(globals())
          # read1()

           

        • from ... import ... 与import对比 ***

          1. from.. import 用起来更方便

            from tbjx import name
            print(name)

             

          2. from...import 容易与本文件的名字产生冲突.

            # 1, 容易产生冲突,后者将前者覆盖
            # name = 'alex'
            # from tbjx import name
            # print(name)
          3. 当前位置直接使用read1和read2,执行时,仍然以tbjx.py文件全局名称空间 ***

            # from tbjx import read1
            #
            # def read1():
            #     print(666)

            # name = '大壮'
            # read1()
            # print(globals())


            from tbjx import change
            name = 'Alex'
            print(name)  # 'Alex'
            change()  # 'barry'
            from tbjx import name
            print(name)

             

        • 一行导入多个

          from tbjx import name,read1,read2  # 这样不好
          from tbjx import name
          from tbjx import read1

           

        • from ... import *

        • 模块循环导入的问题

           

        • py文件的两种功能

          py文件的两个功能:

          1. 自己用 脚本

          2. 被别人引用 模块使用

      print('from the tbjx.py')

       __all__ = ['name', 'read1']  # 配合*使用
       
      name = '太白金星'
       
      def read1():
          print('tbjx模块:', name)

      def read2(): print('tbjx模块') read1()

       def change():
          global name
          name = 'barry'
          print(name)

       

       # print(__name__)
      # 当tbjx.py做脚本: __name__ == __main__ 返回True
      # 当tbjx.py做模块被别人引用时: __name__ == tbjx

      # __name__ 根据文件的扮演的角色(脚本,模块)不同而得到不同的结果
      #1, 模块需要调试时,加上 if __name__ == '__main__':
      # import time

      # change() # 测试代码
      # if __name__ == '__main__':
      #     change()

      # 2, 作为项目的启动文件需要用.
      ```

       

      • 模块的搜索路径 ***

        # import sm
        import abc
        # python 解释器会自动将一些内置内容(内置函数,内置模块等等)加载到内存中
        import sys
        # print(sys.modules) # 内置内容(内置函数,内置模块等等)
        import time

        # print(sys.path)
        #['D:\python_22\day17', 'C:\Python\Python36\python36.zip', 'C:\Python\Python36\DLLs', 'C:\Python\Python36\lib', 'C:\Python\Python36', 'C:\Python\Python36\lib\site-packages']
        # 'D:\python_22\day17' 路径是当前执行文件的相对路径
        # import tbjx

        # 我就想找到dz 内存没有,内置中,这两个你左右不了,sys.path你可以操作.
        import sys
        sys.path.append(r'D:python_22day16')
        # sys.path 会自动将你的 当前目录的路径加载到列表中.
        import dz

        # 如果你想要引用你自定义的模块:
        # 要不你就将这个模块放到当前目录下面,要不你就手动添加到sys.path
      • import sm

        1. 它会先从内存中寻找有没有已经存在的以sm命名的名称空间.

        2. 它会从内置的模块中找. time,sys,os,等等.

        3. 他从sys.path中寻找.

      1. json pickle 模块

    序列化模块: 将一种数据结构(list,tuple,dict ....)转化成特殊的序列.

    为什么存在序列化?

    数据 ----> bytes

    只有字符串类型和bytes可以互换.

    dict,list..... -------> str <--------> bytes

    数据存储在文件中,str(bytes类型)形式存储,比如字典.

    数据通过网络传输(bytes类型),str 不能还原回去.

    特殊的字符串:序列化.

    序列化模块:

    json模块 : (重点

    1. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])

    2. json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None

     

    l1 = [i for i in range(10000)]
    # l1 --->bytes
    # b1 = l1.encode('utf-8')  # 不能直接转换
    # l1转化成字符串在转化成bytes
    s1 = str(l1)
    b1 = s1.encode('utf-8')
    # print(b1)
    
    # 岑哥接收了b1
    s2 = b1.decode('utf-8')
    # print(s2,type(s2))
    
    # str 我们学过的str
    
    # dic = {'username': '太白', 'password': 123,'status': True}
    import json
    #dumps loads 主要用于网络传输,但是也可以读写文件
    # 特殊的字符串
    # st = json.dumps(dic,ensure_ascii=False)
    # print(st,type(st))
    # # 反转回去
    # dic1 = json.loads(st)
    # print(dic1,type(dic1))
    
    # 写入文件
    # l1 = [1, 2, 3, {'name': 'alex'}]
    # 转化成特殊的字符串写入文件
    # with open('json文件',encoding='utf-8',mode='w') as f1:
    #     st = json.dumps(l1)
    #     f1.write(st)
    
    # 读取出来还原回去
    # with open('json文件',encoding='utf-8') as f2:
    #     st = f2.read()
    #     l1 = json.loads(st)
    #     print(l1,type(l1))
    # 特殊的参数
    l1 = [1, 2, 3, {'name': 'alex'}]
    
    # dump load 只能写入文件,只能写入一个数据结构
    # with open('json文件1',encoding='utf-8',mode='w') as f1:
    #     json.dump(l1,f1)
    
    # 读取数据
    # with open('json文件1',encoding='utf-8') as f2:
    #     l1 = json.load(f2)
    #     print(l1,type(l1))
    
    
    # 一次写入文件多个数据怎么做?
    
    # 错误示例:
    # dic1 = {'username': 'alex'}
    # dic2 = {'username': '太白'}
    # dic3 = {'username': '大壮'}
    # with open('json文件1',encoding='utf-8',mode='w') as f1:
    #     json.dump(dic1,f1)
    #     json.dump(dic2,f1)
    #     json.dump(dic3,f1)
    
    
    # 读取数据
    # with open('json文件1',encoding='utf-8') as f1:
    #     print(json.load(f1))
        # print(json.load(f1))
        # print(json.load(f1))
    
    
    # 正确写法:
    dic1 = {'username': 'alex'}
    dic2 = {'username': '太白'}
    dic3 = {'username': '大壮'}
    # with open('json文件1',encoding='utf-8',mode='w') as f1:
    #     f1.write(json.dumps(dic1) + '
    ')
    #     f1.write(json.dumps(dic2) + '
    ')
    #     f1.write(json.dumps(dic3) + '
    ')
    
    # with open('json文件1',encoding='utf-8') as f1:
    #     for i in f1:
    #         print(json.loads(i))
    
    
    

    ​ pickle模块:

     

    1. 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。

    2. 支持Python所有的数据类型包括实例化对象。

     

    l1 = [1, 2, 3, {'name': 'alex'}]
    
    # dumps loads 只能用于网络传输
    # import pickle
    # st = pickle.dumps(l1)
    # print(st)  # bytes
    #
    # l2 = pickle.loads(st)
    # print(l2,type(l2))
    
    # dump load 直接写入文件
    # import 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()
    # import pickle
    # f = open('pick多数据',mode='rb')
    # print(pickle.load(f))
    # print(pickle.load(f))
    # print(pickle.load(f))
    # f.close()
    
    import pickle
    def func():
        print('in func')
    
    # f = open('pick对象',mode='wb')
    # pickle.dump(func,f)
    # f.close()
    
    # f = open('pick对象', mode='rb')
    # ret = pickle.load(f)
    # print(ret)
    # ret()

     

     

    1. hashlib模块

      包含很多的加密算法. MD5, sha1 sha256 sha512......

      用途:

      1. 密码加密.不能以明文的形式存储密码.密文的形式.

      2. 文件的校验.

       

      用法:

      1. 将bytes类型字节 转化成 固定长度的16进制数字组成的字符串.

      2. 不同的bytes利用相同的算法(MD5)转化成的结果一定不同.

      3. 相同的bytes利用相同的算法(MD5)转化成的结果一定相同.

      4. hashlib算法不可逆(MD5中国王晓云破解了).

    # import hashlib
    # hashlib.md5()
    
    # md5
    # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育'
    # import hashlib
    # ret = hashlib.md5()
    # ret.update(s1.encode('utf-8'))
    # print(ret.hexdigest(),)
    
    # 相关练习
    import hashlib
    # def MD5(pwd):
    #     ret = hashlib.md5()
    #     ret.update(pwd.encode('utf-8'))
    #     return ret.hexdigest()
    #
    #
    # def register():
    #     username = input('请输入用户名:').strip()
    #     password = input('请输入密码:').strip()
    #     password_md5 = MD5(password)
    #     with open('register',encoding='utf-8',mode='a') as f1:
    #         f1.write(f'
    {username}|{password_md5}')
    #
    # register()
    #
    # def login():
    #     username = input('请输入用户名:').strip()
    #     password = input('请输入密码:').strip()
    #     password_md5 = MD5(password)
    #
    
    # 普通加密
    
    import hashlib
    # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育'
    # s2 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育'
    # ret = hashlib.md5()
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 18f127c24462dd59287798ea5c0c0c2f  18f127c24462dd59287798ea5c0c0c2f
    # 123456:  18f127c24462dd59258898ea5c0c0c2f
    # 000000:  18f127c24462dd59258898we5c0c0c2f
    
    # s2 = '19890425'
    # ret = hashlib.md5()
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 6e942d04cf7ceeeba09e3f2c7c03dc44
    
    # 加盐
    
    # s2 = '19890425'
    # ret = hashlib.md5('太白金星'.encode('utf-8'))
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 84c31bbb6f6f494fb12beeb7de4777e1
    
    
    # 动态的盐
    # s2 = '19890425'
    # ret = hashlib.md5('太白金星'[::2].encode('utf-8'))
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 84c31bbb6f6f494fb12beeb7de4777e1
    
    
    # sha系列  金融类,安全类.用这个级别.
    # 随着sha系列数字越高,加密越复杂,越不易破解,但是耗时越长.
    # s2 = '198fdsl;fdsklgfjsdlgdsjlfkjsdalfksjdal90425'
    # ret = hashlib.sha3_512()
    # ret.update(s2.encode('utf-8'))
    # print(ret.hexdigest())  # 4d623c6701995c989f400f7e7eef0c4fd4ff15194751f5cb7fb812c7d42a7406ca0349ea3447d245ca29b48a941e2f2f66579fb090babb73eb2b446391a8e102
    
    
    
    # 文件的校验
    
    # linux中一切皆文件: 文本文件,非文本文件,音频,视频,图片....
    # 无论你下载的视频,还是软件(国外的软件),往往都会有一个md5值
    
    
    # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6  *pycharm-professional-2019.1.2.exe
    
    # s1 = '我叫太白金星 今年18岁'
    # ret = hashlib.sha256()
    # ret.update(s1.encode('utf-8'))
    # print(ret.hexdigest())  # 54fab159ad8f0bfc5df726a70332f111c2c54d31849fb1e4dc1fcc176e9e4cdc
    #
    # ret = hashlib.sha256()
    # ret.update('我叫'.encode('utf-8'))
    # ret.update('太白金星'.encode('utf-8'))
    # ret.update(' 今年'.encode('utf-8'))
    # ret.update('18岁'.encode('utf-8'))
    # print(ret.hexdigest()) # 54fab159ad8f0bfc5df726a70332f111c2c54d31849fb1e4dc1fcc176e9e4cdc
    
    # low版校验:
    def file_md5(path):
        ret = hashlib.sha256()
        with open(path,mode='rb') as f1:
            b1 = f1.read()
            # print(b1)
            ret.update(b1)
        return ret.hexdigest()
    result = file_md5('pycharm-professional-2019.1.2.exe')
    print(result)  # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6
    
    # 高大上版
    

     re模块

    import re
    # ret = re.findall('d+','19740ash93010uru')
    # print(ret)
    #
    # ret = re.search('d+','19740ash93010uru')
    # print(ret)  # 变量
    # if ret:
    #     print(ret.group())
    
    # 预习一个现象并且找到答案 - 分组有关系()
    # findall 还是按照完整的正则进行匹配,只是显示括号里匹配到的内容
    # ret = re.findall('9dd','19740ash93010uru')
    # print(ret)
    
    # search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数
    # 来获取具体文组中的内容
    # ret = re.search('9(d)(d)','19740ash93010uru')
    # print(ret)  # 变量
    # if ret:
    #     print(ret.group())
    #     print(ret.group(1))
    #     print(ret.group(2))
    
    # findall
        # 取所有符合条件的,优先显示分组中的
    # search 只取第一个符合条件的,没有优先显示这件事儿
        # 得到的结果是一个变量
            # 变量.group() 的结果 完全和 变量.group(0)的结果一致
            # 变量.group(n) 的形式来指定获取第n个分组中匹配到的内容
    
    # 为什么在search中不需要分组优先 而在findall中需要?
    
    # 加上括号 是为了对真正需要的内容进行提取
    # ret = re.findall('<w+>(w+)</w+>','<h1>askh930s02391j192agsj</h1>')
    # print(ret)
    
    # search
    # ret = re.search('<(w+)>(w+)</w+>','<h1>askh930s02391j192agsj</h1>')
    # print(ret.group())
    # print(ret.group(1))
    # print(ret.group(2))
    
    # 为什么要用分组,以及findall的分组优先到底有什么好处
    exp = '2-3*(5+6)'
    # a+b 或者是a-b 并且计算他们的结果
    # ret = re.search('d+[+]d+',exp)
    # print(ret)
    # a,b = ret.split('+')
    # print(int(a)+int(b))
    
    
    # ret = re.search('(d+)[+](d+)',exp)
    # print(ret)
    # print(ret.group(1))
    # print(ret.group(2))
    # print(int(ret.group(1)) + int(ret.group(2)))
    
    
    # with open('douban.html',encoding='utf-8') as f:
    #     content = f.read()
    # ret = re.findall('<span class="title">(.*?)</span>(?:s*<span class="title">.*?</span>)?',content)
    # print(ret)
    # 如果我们要查找的内容在一个复杂的环境中
    # 我们要查的内容并没有一个突出的 与众不同的特点 甚至会和不需要的杂乱的数据混合在一起
    # 这个时候我们就需要把所有的数据都统计出来,然后对这个数据进行筛选,把我们真正需要的数据对应的正则表达式用()圈起来
    # 这样我们就可以筛选出真正需要的数据了
    
    
    
    # 什么是爬虫
        # 通过代码获取到一个网页的源码
        # 要的是源码中嵌着的网页上的内容   -- 正则表达式
    # import requests
    # ret = requests.get('https://movie.douban.com/top250?start=0&filter=')
    # print(ret.content.decode('utf-8'))
    
    # 分组和findall的现象
        # 为什么要用分组?
            # 把想要的内容放分组里
    # 如何取消分组优先
        # 如果在写正则的时候由于不得已的原因 导致不要的内容也得写在分组里
        # (?:)  取消这个分组的优先显示
    1. 今日总结

      1. import 三件事, import的名字如果调用? 模块名.的方式调用.

      2. from ... import ... 容易产生冲突,独立的空间.

      3. __name__问题

      4. 模块的搜索路径

        内存 内置 sys.path

      5. 序列化模块:

        1. json最最常用(两对四个方法就行) 一定要掌握

        2. pickle(两对四个方法就行) 尽量掌握

      6. hashlib

        1. 密码的加密 ,文件的校验

     

     

  • 相关阅读:
    AES块加密与解密
    流加密的密文解密
    Linux命令——压缩和解压缩
    Linux之Vim学习
    Linux命令——磁盘管理
    Linux命令——用户和用户组管理
    Linux命令——文件和目录管理
    C++的技术探究
    Debian系统下实现通过wpa_config连接WPA-PSK加密的Wifi连接
    如何在openWRT系统上实现双版本
  • 原文地址:https://www.cnblogs.com/zengluo/p/13129067.html
Copyright © 2011-2022 走看看