zoukankan      html  css  js  c++  java
  • python笔记(15)--模块扩展(time/json/shutil/logging)和异常捕获处理

    内容目录:

    • 模块基础知识
    • time/datetime
    • json/picle
    • shutil
    • logging(自备查询)
    • 异常处理
    • 其他

    内容回顾和补充:

    1.模块分类

    • 内置
    • 第三方
    • 自定义

    面试题:

    • 列举常用内置模块:json / time(必须说) /os/sys(补充)

    2.定义模块

    定义模块时可以把一个py文件或一个文件夹(包)当做一个模块,以方便于以后其他py文件的调用。

    对于包的定义:

    • py2:创建文件夹时必须有一个 _ _int _ _.py文件

    • py3:不需要创建 _ _int _ _.py

      推荐以后写代码时,都要加上此文件。

    3.模块的调用

    3.1 示例一

    # 本模块名字为mode.py
    
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    def show():
    	print('我是中国人')
    def func():
    	pass
    
    # 导入模块,加载此模块中所有的值到内存。
    import mode
    
    # 调用模块中的函数
    mode.func()
    

    3.2 示例二

    #导入模块
    from mode import func,show	#只调用两个函数到内存中
    from mode import func
    from mode import show
    from mode import * 			#调用mode文件中的所有到内存中
    
    #使用模块中的函数
    func()						
    
    #导入模块
    from mode import func as f   #如果被调用的模块中与当前文件中的函数重名,可以使用as 更改使用的名字
    
    def func():
        print(123)
        
    f()				#此时执行的是模块中的功能函数
    

    导入模块:

    • import 模块 模块.函数()
    • from 模块 import 函数 函数()
    • from 模块 import 函数 as 别名 别名()

    3.3 示例三

    mode:
        - jd.py
        - pdd.py
        - tb.py
    包.py
    
    #调用mode包的jd模块中f1函数
    #方式一:
    import mode.jd
    mode.jd.f1()
    
    #方式二:
    from mode import jd
    jd.f1()
    
    #方式三:
    from mode.jd import f1
    f1()
    

    总结:

    • 模块和要执行的.py文件在同一目录 且 需要模块中很多功能时,使用:import方式导入模块
    • 其他方式一:from 模块 import 模块 模块.函数()
    • 其他方式二:from 模块.模块 import 函数 函数()

    4内置模块

    • os

    • sys

    • time

    • json

      • dumps

      • loads

        • 注意:中文序列化后默认变为ASCII码

          字典或列表中如有中文,序列化时想要保留中文显示:

          v = ['k1':'alec','k2':'李亚楠']
          
          import json
          val = v.dumps(v,ensure_ascii=False)
          print(val)		#序列化后得到的结果保留了中文
          
        • dump(不常用):把序列化后的列表写入文件中

          import json
          
          v = ['k1':'alec','k2':'李亚楠']
          f = open('x.txt',mode='w',encoding='utf-8')
          val = json.dump(v,f)
          print(val)
          f.close()
          
        • load

          import json
          
          v = ['k1':'alec','k2':'李亚楠']
          f = open('x.txt',mode='r',encoding='utf-8')
          
          val = json.load(f)
          f.close()
          
          print(val,type(val))
          
    • haslib

    • random

    • getpass

    • shutil

    • copy

    今日内容

    1.pickle和json(常用json)和shelve

    • json的优点:所有语言通用;缺点:只能序列化基本的数据类型 list / dict / int.....
      • dumps序列化出来的是字符串(str类型)
    • pickle的优点:python中所有的东西都能被它序列化(socket对象);缺点:序列化内容只有python认识
      • dumps序列化出来的是字节(byte类型)
    • shelve的优点:序列化句柄,使用句柄直接操作,非常方便
    import pickle
    # #################### dumps/loads ######################
    v = {1,2,3,4}
    
    val = pickle.dumps(v)
    print(val)
    
    data = pickle.loads(val)
    print(data)
    
    ###也可以序列化函数
    def f1():
    print('f1')
    v1 = pickle.dumps(f1)
    print(v1)
    v2 = pickle.loads(v1)
    v2()
    # #################### dump/load ######################
    #因为写入的都是二进制,所以读写模式改为wb / rb
    v = {1,2,3,4}
    f = open('x.txt',mode='wb')
    val = pickle.dump(v,f)
    f.close()
    
    
    f = open('x.txt',mode='rb')
    data = pickle.load(f)
    f.close()
    print(data)
    

    字节知识点:

    b'x80x03cbuiltins
    set
    qx00]qx01(Kx01Kx02Kx03Kx04ex85qx02Rqx03.'
    此称为字节类型
    

    2.shutil模块

    • 删除和修改文件示例:

      import shutil
      
      #只能删除文件夹
      shutil.rmtree('codett')
      
      #能修改文件和文件夹
      shutil.move('codeTT','codett')
      shutil.move('test.py','test01.py')
      
    • 压缩和解压文件示例:

      import shutil
      
      #压缩文件,自动压缩到当前目录。参数('压缩文件名称','压缩后文件格式','被压缩文件路径')
      shutil.make_archive('zzp','zip','D:pycharm_projectpython36codett')
      
      #解压文件,参数('当前目录下需解压文件','解压到路径下','解压后格式')
      #(extract_dir=)表示如果解压的路径不存在,则创建路径
      shutil.unpack_archive('zzp.zip',extract_dir='D:code02codett',format='zip')
      

    3.datetime模块

    • 获取当前时间

      from datetime import datetime
      
      #获取当前时间
      ctime01 = datetime.now()
      ctime02 = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
      print(ctime01)			#2019-09-10 10:27:32.746868
      print(ctime02)			#2019-09-10-10-27-32
      
    • 练习题:

      from datetime import datetime
      import os
      import shutil
      #获取当前时间
      ctime01 = datetime.now()
      ctime02 = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
      
      #1.压缩codett文件夹 zip
      #2.放到code目录(默认不存在)
      #3.将文件解压到D:xx目录中
      shutil.make_archive(os.path.join('code',ctime02),'zip','D:pycharm_projectpython36codett')
      
      file_path = os.path.join('code',ctime02)+ '.zip'
      shutil.unpack_archive(file_path,r'D:xx')
      
    • 时区及时间

      • 获取当前本地时间,和当前UTC世界时间(常用)
      from datetime import datetime,timezone,timedelta
      
      v1 = datetime.now()     #当前本地时间
      print(v1)
      
      v2 = datetime.utcnow()  #当前UTC世界时间
      print(v2)
      
      #东7区时间,hours=-7表示西7区时间
      tz = timezone(timedelta(hours=7))   
      v3 = datetime.now(tz)
      print(v3)
      
      • datetime时间提取成字符串格式(常用)
      from datetime import datetime
      
      v1 = datetime.now()
      print(v1,type(v1))		#2019-09-10 18:06:59.265811 <class 'datetime.datetime'>
      val = v1.strftime("%Y-%m-%d %H:%M:%S")
      print(val,type(val))	#2019-09-10 18:06:59 <class 'str'>
      
      • datetime时间的相加减(常用)
      #做时间的相加减,必须转换为datetime格式,才能相加减
      from datetime import datetime
      
      v1 = datetime.strptime('2016-07-07 11:00','%Y-%m-%d %H:%M')  #转换成datetime格式
      v2 = v1 - timedelta(days=140)		#天数加140天,timedelta可以查看里面的参数,加减年月周日时分秒
      print(v2,type(v2))
      
      data = v2.strftime('%Y-%m-%d %H:%M')	#转换成字符串格式
      print(data,type(data))
      
      • 时间戳和datetime的关系
      import time
      from datetime import datetime
      # #######时间戳转换成datetime时间##############################
      ctime = time.time()			#获取当前时间戳
      print(ctime)				#输出1568112171.719181
      v1 = datetime.fromtimestamp(ctime)	#转换成datetime时间
      print(v1)					#输出2019-09-10 18:42:51.719181
      
      # #######datetime时间转换成时间戳##############################
      v2 = datetime.now()		#获取当前时间
      print(v2)
      val = v2.timestamp()	#转换成时间戳
      print(val)
      

    datetime模块总结

    • 比较常用的就是时间戳和str格式的时间
    • 时间戳 -------> datetime格式(做时间加减) -------> str格式
    • 时间戳 <------- datetime格式(做时间加减) <------- str格式

    4.异常捕获/处理

    • 可以适用于任何地方,遇到能让程序崩溃的地方可以加上

      • except+类型错误:可以适用于自己预知的各种错误,try和except配合使用,和if....elif....类似
      • 加else:没有异常的时候执行else
      • finally:不管有没有异常,都会执行,一般用于函数,前面执行return时也会先执行finally再执行return
      #如果输入错误则处理异常,返回“输入异常”
      try:
          val = input('请输入数字:')
          data = int(val)
      except Exception as e:
          print("输入异常")
      
      #except+类型错误:可以适用于自己预知的各种错误,try和except配合使用,和if....elif....类似
      #加else:没有异常的时候执行else
      #finally:不管有没有异常,都会执行,一般用于函数,前面执行return时也会先执行finally再执行return
      try:
          # [][3]
          ret = int(input('number:'))
          print(ret*'*')
      except ValueError:
          print('您输入的内容有误,请输入一个数字')
      except IndexError:
          print('超出列表的最大长度了')
      except Exception:
          print('整体崩溃')
      else:
          print('没有异常的时候执行else中的代码')
      finally:#例子:文件关闭,或者数据库断开连接,return和finally相遇时,finally也会执行
          print('不管有没有异常,都会执行')
      
      #适用于函数
      def func(a):
          try:
              return a.strip()
          except Exception as e:
              pass
      
          return False
      
      v = func('alex')
      if not v:
          print('函数执行失败')
      else:
          print('结果为',v)
      

    列子:写异常捕获前分析try的位置,位置不同结果不同。比如:

    #写函数,接收一个url列表,请访问每一个地址并打印结果出来
    import requests
    def func(url_list):
        result = []
        for url in url_list:
            try:
                response =requests.get(url)
                result.append(response.text)
            except Exception as e:
                pass
        return result
    
    val = func(['http://www.baidu.com','http://www.google.com','http://www.bing.com'])
    print(val)
    
    #同上,如果异常捕获try写在for循环外面,则无法捕获异常。
    def func(url_list):
        result = []
        try:
            for url in url_list:
                response =requests.get(url)
                result.append(response.text)
        except Exception as e:
            pass
        return result
    
    • raise,主动抛出异常

      def connect_db(e):
          count = 0
          while count < 3:
              e.wait(1) 
              if e.is_set() == True:
                  print('连接数据库')
                  break
              else:
                  count += 1
                  print("第%s次数据库连接失败"%count)
          else:
              raise TimeoutError('数据库连接超时')
              #如果三次机会都连接失败,则抛出超时异常
      

    总结

    函数高级(必会)

    • 嵌套
    • 装饰器

    模块分类和定义(精通)

    • 内置模块
      • os
      • sys
      • ....
    • 第三方模块
      • requests
      • xlrd
    • 自定义模块
      • 文件
      • 文件夹 + init.py【包】

    导入模块

    • sys.path
    • 导入
      • import
      • from 模块.模块 import 函数

    异常处理(必会)

    try:
        pass                 #要执行的代码块
    except Exception as e:
        pass				#遇到程序崩溃要抛出的异常
    
  • 相关阅读:
    简单命令行总结
    [大餐]开发摘记1--我的Fragment通信的框架 | 卖牙膏的芖口钉
    DZNEmptyDataSet的使用
    Java笔记(一)
    mingster.com
    2014新年福利,居然有人将Ext JS 4.1的文档翻译了
    【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三
    【翻译】在Ext JS应用程序中使用自定义图标
    【翻译】Siesta事件记录器入门
    【翻译】使用新的Sencha Cmd 4命令app watch
  • 原文地址:https://www.cnblogs.com/lynlearnde/p/12909616.html
Copyright © 2011-2022 走看看