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 #遇到程序崩溃要抛出的异常