zoukankan      html  css  js  c++  java
  • python之模块Ⅱ

    模块Ⅱ

    1. 序列化模块(重点)

      1. 定义:将一个数据类型结构(list,dict...)转化成一个特殊的序列(特殊的字符串)的过程。

        ​ 在文件存储和文件传输时有时会遇到,将原数据结构转化为str()存储在文件,或转化为bytes通过网络传输后,在读取文件或接收到文件后无法转换为原数据结构。通过序列化模块可将原数据类型转化为一种特殊的字符串,这个字符串可以与任何的数据结构相互转换。

      2. 序列化模块的分类

        ​ 序列化模块可将一种数据结构转化为特殊的序列(字符串、bytes)并且还可以转换回去。目前序列化模块有三种:json模块,pickle模块,shevle模块

        • json序列化

          ​ 是所有语言公认的最常用的一种序列,但是支持的python数据结构有限

          可分为两对四个方法:

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

            import json
            dic = {'username': '王大锤', 'password': 123,'status': False}
            ret = json.dumps(dic)#序列化:将一个字典转换成一个字符串
            print(ret,type(ret))
            #{"username": "u738bu5927u9524", "password": 123, "status": false} <class 'str'>
            #注意,json转换完的字符串类型的字典中的字符串是由""表示的
            ret_dict = json.loads(ret)#反序列化:将一个字符串格式的字典转换成一个字典
            print(ret_dict)
            #{'username': '王大锤', 'password': 123, 'status': False}
            #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
            

            可传递参数:

            dic = {'username': '王大锤', 'password': 123,'status': False}
            ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
            print(ret,type(ret))
            #{"password": 123, "status": false, "username": "王大锤"} <class 'str'>
            

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

            存取文件:

            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用于文件存取

            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)
            
          3. 将多个数据存储到文件中

            import json
            dic1 = {'username': '王大锤', 'password': 123,'status': False}
            dic2 = {'username': 'abc', '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序列化

          1. dumps,loads只能用于网络传输

            import pickle
            l1 = ['wusir', '太白', '小黑', 666]
            ret = pickle.dumps(l1)
            print(ret)
            #b'x80x03]qx00(Xx06x00x00x00xe5xb0x8fxe9xbbx91qx01Mx9ax02e.'
            l2 = pickle.loads(ret)
            print(l2,type(l2))
            ['小黑', 666] <class 'list'>
            
          2. 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)
            
    2. os模块

      • 与工作目录(当前目录、父级目录)有关的

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

        os.makedirs('dirname1/dirname2')    #可生成多层递归目录  ***
        os.removedirs('dirname1') #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 ***
        os.mkdir('dirname')    #生成单级目录;相当于shell中mkdir dirname ***
        os.rmdir('dirname')    #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname ***
        os.listdir('dirname')    #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 **
        
      • 和文件相关

        os.remove()  #删除一个文件  ***
        os.rename("oldname","newname")  #重命名文件/目录  ***
        os.stat('path/filename')  #获取文件/目录信息 **
        
      • 和路径相关

        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的大小 ***
        
    3. sys模块

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

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

      1. 定义:加密模块、摘要算法、散列算法等等,他是一堆加密算法的集合

      2. hashlib如何加密

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

        • 文件加密,md5加密级别是最低的,sha系列安全系数高,耗时高。

          import hashlib
          md5 = hashlib.md5()
          md5.update('123456'.encode('utf-8'))
          print(md5.hexdigest())
          # 'e10adc3949ba59abbe56e057f20f883e'
          

          加固定的盐

          ret = hashlib.md5('xxx公司'.encode('utf-8'))
          ret.update('123456'.encode('utf-8'))
          s = ret.hexdigest()
          print(s,type(s))
          # 1ef97f2f10b2ba2dc273a9641cd713d2 <class 'str'>
          

          加动态的盐

          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)
          
        • 文件一致性校验

          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()
          
    5. time模块

      三种表示方式:时间戳(timestamp)、格式化的时间字符串(Format String)、元组(struct_time)

      • 时间戳

        import time
        print(time.time())
        # 1561713996.1833062
        
      • 时间字符串

        import time
        print(time.strftime('%y-%m-%d %H:%M:%S'))
        # 19-06-28 17:27:27
        
      • 结构化时间

        localtime将一个时间戳转换为当前时区的struct_time

        import time
        timestamp = time.time()
        st = time.localtime(timestamp)
        print(st)
        # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=17, tm_min=34, tm_sec=33, tm_wday=4, tm_yday=179, tm_isdst=0)
        

      格式化时间 ----> 时间戳

      ft = time.strftime('%Y/%m/%d %H:%M:%S')
      st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
      print(st) # 转化为结构化时间
      timestamp = time.mktime(st)
      print(timestamp) # 转化为时间戳
      # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=17, tm_min=35, tm_sec=55, tm_wday=4, tm_yday=179, tm_isdst=-1)
      #1561714737.0
      

      时间戳 ---> 结构化时间

      t = time.time()
      st = time.localtime(t)
      print(st) # 转化为结构化时间
      ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
      print(ft) # 转化为格式化时间
      # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=17, tm_min=42, tm_sec=55, tm_wday=4, tm_yday=179, tm_isdst=0)
      # 19-06-28 17:42:55
      
    6. datetime模块

      # datatime模块
      import datetime
      now_time = datetime.datetime.now()  # 现在的时间
      # 只能调整的字段:weeks days hours minutes seconds
      print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
      print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前
      current_time = datetime.datetime.now()
      # 可直接调整到指定的 年 月 日 时 分 秒 等
      
      print(current_time.replace(year=1977))  # 直接调整到1977年
      print(current_time.replace(month=1))  # 直接调整到1月份
      print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601
      
      # 将时间戳转化成时间
      print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17
      
    7. random模块

      >>> import random
      #随机小数
      >>> random.random()      # 大于0且小于1之间的小数
      0.7664338663654585
      >>> random.uniform(1,3) #大于1小于3的小数
      1.6270147180533838
      
      #随机整数
      >>> random.randint(1,5)  # 大于等于1且小于等于5之间的整数
      >>> random.randrange(1,10,2) # 大于等于1且小于10之间的奇数
      
      
      #随机选择一个返回
      >>> random.choice([1,'23',[4,5]])  # #1或者23或者[4,5]
      #随机选择多个返回,返回的个数为函数的第二个参数
      >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
      [[4, 5], '23']
      
      
      #打乱列表顺序
      >>> item=[1,3,5,7,9]
      >>> random.shuffle(item) # 打乱次序
      >>> item
      [5, 1, 3, 7, 9]
      >>> random.shuffle(item)
      >>> item
      [5, 9, 7, 1, 3]
      
  • 相关阅读:
    python模块整理2-sys模块 分类: python Module 2013-09-13 16:49 563人阅读 评论(0) 收藏
    sys常用模块小探 分类: python Module 2013-09-13 16:42 339人阅读 评论(0) 收藏
    先执行linux的clear清屏命令,再执行其他操作 分类: python 小练习 2013-09-13 11:23 441人阅读 评论(0) 收藏
    MySQL 解决ERROR 1045 (28000): Access deniedfor user datam@localhost (using password: YES)的问题 分类: database 2013-09-12 15:52 402人阅读 评论(0) 收藏
    函数名function是一个数据类型,可以赋值 分类: python基础学习 2013-09-12 11:01 366人阅读 评论(0) 收藏
    解决 mysql error: Failed dependencies: 错误 分类: database 2013-09-11 11:23 772人阅读 评论(0) 收藏
    Java之wait()/sleep()和notify()/notifyAll()
    Java之数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream的嵌套
    Eclipse的简易教程
    JAVA中的反射机制
  • 原文地址:https://www.cnblogs.com/yaoqi17/p/11104595.html
Copyright © 2011-2022 走看看