Python常用模块

  1. 常用模块的介绍

    • time,datetime

      • time:和时间相关

        • time.time(),获取时间戳(从时间原点(1970年1.1 00.00.00)到现在经过的秒数)
        • time.gmtime(),GMT时间,获取格式化时间对象,可以给时间戳,若不给则使用现在的时间戳
        • time.localtime(),当地时间,可以给时间戳,若不给则使用现在的时间戳
        • 格式化时间对象和字符串进行转换
          • str=time.strftime("%Y-%m-%d %H:%M%S",[time_obj]),将时间对象格式化为字符串。
          • obj=time.strptime("2020-05-20","%Y-%m-%d"),将字符串解析为时间对象。
        • time模块的三大对象:
          1. 格式化时间对象
            • 转化为时间戳
              • time.mktime()
            • 格式化为时间字符串
              • time.strftime(format)
          2. 时间字符串
            • 解析为格式化时间对象
              • time.strptime(str,format)
          3. 时间戳:从时间元年开始的秒数
            • 获取:
              • time.time()
            • 转化为格式化时间对象:
              • time.gmtime()
              • time.localtime()
        • time.sleep(XXX),暂停(睡眠)当前的进程XXX秒
      • datetime,日期时间模块

        • 封装了一些和日期时间相关的类:

          • date类:

            • 创建date类
              • d=datetime.date(2010,10,10)
            • 获取date对象的各个属性
              • print(d.year)
              • print(d.mouth)
              • print(d.day)
          • time

            • 创建time类
              • t=datetime.time(10,48,59)
            • 获取date对象的各个属性
              • print(t.hour)
              • print(t.minute)
              • print(t.second)
          • datetime

            • 创建datetime类
              • dt=datetime.datetime(2010,11,11,11,11,11)
            • 获取datetime各个属性同上面两个类一样
          • timedelta

            • datetime中的类,主要用于科学计算(只能与date,datetime,timetelta进行运算)
            • 创建datedelta对象
              • td=datetime.timedelta(days=1)
            • 参与时间运算
              • d=datetime.date(2010,10,10)
              • res=d+td
              • print(res) # 2010-10-11
            • 时间变化量的计算是否会产生进位(会)
              • t=datetime.datetime(2010,10,10,10,10,59)
              • td=datetime.timedelta(seconds=3)
              • res=t+td
              • print(res) # 会产生进位
          • 练习:计算某一年的二月份有多少天

            • 普通算法:根据年份计算是否是闰年,是:29,否:28

            • 用datetime模块

              """
              首先创建出指定年份的3月1号,然后让他往前走一天
              """
              import datetime
              year=int(input("输入年份"))
              # 创建指定年份的date对象
              d=datetime.date(year,3,1)
              # 创建一天 时间段
              td=datetime.timedelta(days=1)
              res=d-td
              print(res.day)
              
          • 和时间段进行运算的结果类型

            • datetime.timedelta和什么类型进行运算,结果就是什么类型(结果数据类型和操作数类型保持一致)
    • os,sys

      • os:和操作系统相关的操作被封装在这个模块中

        • 和文件操作相关的,重命名,删除:在程序中删除,不会放进回收站

          import os
          os.remove(f'a.txt') # 删除
          os.rename('a.xtx','b.txt') # 重命名
          os.removedirs('aa') # 删除目录(仅限空目录)
          
        • 和路径相关的操作,被封装到另一个子模块中:os.path

          • dirname(path),返回path的父路径,不判断路径是否存在
          • basename(path),和dirname相反,取得路径的最后一层(文件名)
          • split(path),上面两个功能的结合,把路径中的路径名和文件名切分开,返回的结果是元组
          • join(str1,str2,str3,filename),拼接路径
          • exists(path),判断路径是是否存在 ,返回bool值
          • isdir(s),判断是否是个目录,真实去找,找到返回bool值,若不存在False
          • isfile(s),,判断是否是个文件,真实去找,找到返回bool值,若不存在False
          • isabs(path),判断是否为绝对路径
          • abspath(path),将括号中的路径转化为绝对路径
            • 如果是/开头的路径,默认是在当前盘符下。
            • 如果没有/那么是以当前文件所在位置路径进行拼接
          • os.islink(path),判断是否为快捷方式
      • shutil:可以删除带内容的目录(自动化运维必看)

        • shutil.retree('aa')
      • sys:和Python解释器相关的操作

        • 获取命令行方式运行的脚本后面的参数(主要作用)

          import sys
          print(sys.argv[0])# 脚本名
          print(sys.argv[1])# 第一个参数
          print(sys.argv[2])# 第二个参数
          
        • sys.path,解释器寻找模块的路径

        • sys.modules(),返回已经加载的模块

    • json,pickle

      • 简介:JavaScript Object Notation :Java脚本兑现标记语言。已经成为一种简单的数据交换格式。

      • python中set不能使用json表示出来

      • 序列化(serialization):结构化数据和线性数据之间的转换就叫序列化

        • 将内存中的数据转换成字符串用以包存在文件或通过网络传输,称为序列化过程
        • 从文件中,网络中获取的数据转换成内存中原来的数据类型格式,称为反序列化过程

      • json模块

        • 将数据转换成字符串,是一种不完全的序列化格式,用于存储或网络传输,虽然不太彻底,但是简单易用易懂

        • json文件通常是一次性写,一次性读,使用另一种方式可以实现多次写,多次读

          • dumps:序列化,把指定的对象转换成json格式的字符串,继续存储在内存中
          • dump:序列化,把指定的对象转换成json格式的字符串,写入文件
          • loads:反序列化,把
          • load:反序列化

          序列化

          dumps

          import json
          s=json.dumps([1,2,3])
          print(type(s)) # str
          print(s) # '[1,2,3]'
          --------------------
          # 元组序列化后,变成列表
          s=json.dumps((1,2,3))
          print(s) # '[1,2,3]'
          --------------------
          res=json.dumps(10)
          print(res) # '10'
          --------------------
          res=json.dumps({'name':'Andy','age':10})
          print(res) # '{'name':'Andy','age':10}'
          
          

          dump

          # 将json结果写到文件中
          import json
          with open('a.txt',mode='w',encoding='utf-8') as f :
              json.dump([1,2,3],f)
          

          反序列化

          loads

          import json
          res=json.dumps([1,2,3])
          lst=json.loads(res) # 反序列化
          print(type(lst)) # list
          print(lst) # [1,2,3]
          ----------------------------
          # 元组会变成列表
          res=json.dumps((1,2,3))
          lst=json.loads(res) # 反序列化
          print(type(lst)) # list
          print(lst) # [1,2,3]
          

          load

          import json
          with open('a.txt',encoding='utf-8') as f:
              res=json.load(f)
              print(type(res)) # list
              print(res)	# [1,2,3]
          

          通过另一种方法实现多次写多次读

          import json
          with open('json.txt',mode='at',encoding='utf-8') as f:
              f.write(json.dumps([1,2,3])+'\n')
              f.write(json.dumps([1,2,3])+'\n')
          -------------------------------------------------------
          # 把分次序列化的json字符串,反序列化回来
          with open('json.txt',mode='rt',encoding='utf-8') as f:
              res=json.loads(f.readline().strip())
              print(res)
              res2=json.loads(f.readline().strip())
              print(res2)
          -------------------
          	for x in f:
                  print(json.loads(x.strip()))
          
      • pickle模块:

        • 将Python所有的数据类型直接转换成字节串,序列化过程

        • 将字节串转换成Python中的数据类型,反序列化过程

        • 保存了原有的数据类型,所有的数据类型都可以进行序列化

          序列化

          import pickle
          bys=pickle.dumps([1,2,3])
          print(type(bys)) # bytes
          print(bys) # b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.'
          -----------------------
          bys=pickle.dumps((1,2,3))
          print(bys)
          res=pickle.loads(bys) # <class 'tuple'>
          print(type(res))
          ----------------------
          bys=pickle.dumps(set('abc'))
          res=pickle.loads(bys) # <class 'tuple'>
          print(type(res))
          
          

          操作文件

          import pickle
          with open('a.txt',mode='wb') as f:
              pickle.dump([1,2,3],f)
              pickle.dump([1,2,3],f)
              pickle.dump([1,2,3],f)
          -------------------------------
          # 从文件中反序列化pickle数据
          with open('c.txt',mode='rb') as f:
              '''
              res=pickle.load(f)
              print(type(res)) # list
              print(res)	# [1,2,3]
              '''
              for x in range(3):
                  res=pickle.load(f)
                  print(res)
          
          

          json和pickle的比较

          json:

          1. 不是所有的数据类型都可以序列化,结果是字符串
          2. 不能多次对同一个文件序列化
          3. json数据可以跨语言

          pickle:

          1. 所有的python类型都能序列化,结果是字节串,
          2. 可以多次对同一个文件序列化
          3. 不能跨语言
    • hashlib,colletions

      • hashlib模块

        封装一些用于加密的类

        • 加密的目的:用于判断和验证,而非解密。

          • 给一个数据加密
          • 验证:用另一个数据加密的结果和第一次加密的结果对比
          • 如果结果相同,说明原文相同,若果不同,说明原文不同
        • 特点:

          • 把一个大的数据切分成不同的小块,分别对不同的块进行加密,再汇总的结果,和直接对整体数据加密的结果是一致的。
          • 单向加密,不可逆。
          • 原始数据的一点小的变化,将导致结果非常大的差异。雪崩效应
        • 使用方式

          '''
          md5加密算法
          给一个数据加密的三大步骤:
          1.获取一个加密对象
          2.使用加密对象的update,进行加密,update方法可以调用多次
          3.通常通过hexdigest获取加密结果,或digest()方法
          '''
          import hashlib
          # 获取一个加密对象
          m=hashlib.md5()
          # 使用加密对象的update,进行加密
          m.update('abc'.encode('utf-8'))
          # 通过hexdigest获取加密的结果
          res=m.hexdigest()
          print(res)  # 900150983cd24fb0d6963f7d28e17f72
          
          

          不同加密算法:实际上就是加密结果的长度不同

          '''
          hashlib.sha224
          '''
          import hashlib
          # 获取一个加密对象
          m=hashlib.sha224()
          # 使用加密对象的update,进行加密
          m.update('abc'.encode('utf-8'))
          # 通过hexdigest获取加密的结果
          res=m.hexdigest()
          print(res)  # 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
          
          

          在创建对象时,可以指定参数,称为salt(加盐)

          '''
          hashlib.sha224
          '''
          import hashlib
          # 获取一个加密对象
          m=hashlib.md5('abc'.encode('utf-8'))
          m.update('efg'.encode('utf-8'))
          # 通过hexdigest获取加密的结果
          res=m.hexdigest()
          print(res)  # fbd7809b1f99a5b790068736a1c62cf0
          -----------------------------------------------
          m=hashlib.md5('abcefg'.encode('utf-8'))
          res=m.hexdigest()
          print(res)  # fbd7809b1f99a5b790068736a1c62cf0
          
          

          注册,登录程序

          import hashlib
          # 获取一个加密对象
          def get_md5(username,passwd):
              m=hashlib.md5()
              m.update(username.encode('utf-8'))
              m.update(passwd.encode('utf-8'))
              return m.hexdigest()
          def register(username,passwd):
              # 加密
              res=get_md5(username,passwd)
              # 写入文件
              with open('login',mode='at',encoding='utf-8') as f:
                  f.write(res+'\n')
          def login(username,passwd):
              # 获取当前登录信息的加密结果
              res=get_md5(username,passwd)
              # 读文件,和其中的数据进行对比
              with open('login',mode='rt',encoding='utf-8') as f:
                  for line in f:
                      if res==line.strip():
                          return True
                      else:
                          return False
          while True:
              op = int(input('1.注册 2.登录 3.退出\n'))
              if op==3:
                  break
              elif op==1:
                  username=input("请输入用户名:")
                  passwd=input('输入密码:')
                  register(username,passwd)
              elif op==2:
                  username=input("请输入用户名:")
                  passwd=input('输入密码:')
                  res=login(username,passwd)
                  if res:
                      print('登陆成功')
                  else:
                      print("登陆失败")
          
          
    • collections模块

      • namedtuple():命名元组

        from collections import namedtuple
        Rectangle=namedtuple('Rectangleclass',['lenght','width'])
        r=Rectangle(10,5)
        # 公国属性访问元组的元素
        print(r.lenght)	# 10
        # 通过索引的方式访问元素
        print(r[0])
        
        
      • defaultdict():默认值字典

        from collections import namedtuple
        from collections import defaultdict
        # 创建一个字典的方式
        # d={'name':'Andy','age':10}
        # d=dict([('name','Andy'),('age',10),])
        # d={k:v for k in [(1,2),(3,4)]] }
        
        # 可以自定义函数充当地一个参数
        # 要求,不能有参数
        def f():
            return 'hello'
        d=defaultdict(f,name="Andy",age=10)
        print(d['name'])    # Andy
        print(d['age']) # 10
        print(d['addr'])    # 0 {'addr':0} 也会被添加
        print(d)
        
        
      • Counter():计数器,统计可迭代对象中元素出现的次数

        from collections import Counter
        c=Counter('assadfasdfasdgfdfgsadf')
        print(c)    # Counter({'a': 5, 's': 5, 'd': 5, 'f': 5, 'g': 2})
        print(c.most_common(3)) # [('a', 5), ('s', 5), ('d', 5)]
        
        
  2. 总结

    • 自定义模块
    • random
    • time
    • datetime
    • os
    • sys
    • json,pickle
    • hashlib
    • collections
posted @ 2021-05-25 18:00  double大博  阅读(110)  评论(0)    收藏  举报