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'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
此称为字节类型

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_project\python36\codett')
    
    #解压文件,参数('当前目录下需解压文件','解压到路径下','解压后格式')
    #(extract_dir=)表示如果解压的路径不存在,则创建路径
    shutil.unpack_archive('zzp.zip',extract_dir='D:\code02\codett',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_project\python36\codett')
    
    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				#遇到程序崩溃要抛出的异常
posted @ 2020-05-18 11:37  薛定谔的猫儿  阅读(117)  评论(0编辑  收藏  举报