总结day13-day15
day-13
- 认识模块
模块分为系统模块和自定义模块两种:
1)系统模块:python自带的模块,例如: functools,math,random,re,datetime,time,turtle,smtplib/socket,threading等
2)自定义模块:由程序员自己创建的模块
导入模块 - 怎么在一个模块中去使用另外一个模块中的内容
如果我们想要使用的内容(变量、函数、类)在另外一个模块中,可以用,但是使用之前必须先导入
一个模块中欧冠的内容想要能被其它模块使用的前提: 模块名必须符合变量名的要求(是标识符,不是关键字)
怎么导
1) import 模块名 - 导入指定模块,导入后可以通过'模块名.'的方式使用这个模块中所有的全局变量
2) from 模块名 import 变量名1,变量名2,... - 导入指定模块,导入后可以直接使用import后面的所有变量
3) from 模块名import * -导入指定模块,导入后可以直接使用模块中所有的全局变量
4)重命名
import 模块名 as 新模块名 - 对模块名重命名
from 模块名 import 变量名1,变量名2 as 新变量名1,变量名2... - 对变量重命名 #----------------------------方法1
# import demo1
#
# print(demo1.a)
# demo1.func1()#----------------------------方法2
from demo1 import a, func1
print(a)func1()# ---------------------------方法3
# from 包.模块 import 变量1,变量2# ---------------------------方法4
# 如果要使用包中__init__.py中内容,直接用包导入和使用
# from package1 import XX
- 导入的原理与阻止导入
1)导入的原理
不管是通过import直接导入模块,还是通过from-import导入模块中的变量,原理都是进入指定模块,将模块中的代码全部执行一遍2)阻止导入
在被导入的模块中添加指定的if语句(main提示出来的if语句)
if __name__ == '__main__':
包
- 什么是包
包含__init__.py文件的文件夹就是包
- 导入包中的模块
# ===================导入方式===============
# import package1.jsonfile as jsonfile
# jsonfile.read_json# =================导入方式2=================
# from 包 import 模块1,模块2,....
# from 包 import *# from package1 import jsonfile,csvfile
# jsonfile.read_json()#================导入方式3===============
# from 包.模块 import 模块1,模块2,...
# from package1.jsonfile import read_json,name
# read_json()# __init__.py 作用
# 1. 创建快捷键
# from package1 import xx# 2. 封装通用功能
def open_file():print('打开文件')
异常捕获
- 异常
异常就是错误(程序报错 == 程序出现异常)
如果执行程序的过程中出现异常,程序会直接结束,不会再接着往后执行
- 异常捕获
异常捕获就是让程序出现异常的时候不报错,并且程序可以继续执行什么时候需要异常捕获: 明明知道某段代码可能会出现异常,但是出现异常原因不是代码写错误了,而是因为使用者操作不当导致的,又不想因此导致程序崩溃,就可以使用异常捕获语法1:
try:需要捕获异常的代码段
except:捕获到异常后会执行的代码执行过程: 先执行代码段1: 执行过程中如果出现异常不报错马上执行代码段2,然后再执行后续的其它代码如果代码段1没有出现异常,不执行代码段2,直接执行后续的其它代码2)语法2 - 捕获特定异常
try:代码段1(需要捕获异常的代码段)
except 异常类型:代码段(捕获到异常后会执行的代码)3)语法3 - 同时捕获多种异常(针对相同异常做一样的处理)
try:代码段1(需要捕获异常的代码段)
except 异常类型1,异常类型2,异常类型3...:代码段(捕获到异常后会执行的代码)4) 语法4 - 同时捕获多种异常(针对不同异常做不一样的处理)
try:代码段1(需要捕获异常的代码段)
except 异常类型1:代码段(捕获到异常后会执行的代码)
except 异常类型2:代码段(捕获到异常后会执行的代码)
except 异常类型3:代码段(捕获到异常后会执行的代码)
- 抛出异常 - 主动让程序崩溃
# raise 异常类型
class AgeError(Exception):def __str__(self):return '年龄错误'age = int(input('请输入年龄'))
if age < 0 or age > 150:raise AgeError
day14
os模块
- os模块的作用
os 模块 - 提供和文件或文件夹或文件夹目录的路径相关的操作
例如: 创建文件夹、创建文件、删除文件、判断文件是否存在、获取绝对路径、获取一个文件夹中所有的文件等# 1)返回当前工作目录
import os
print(os.getcwd()) #D:\pycharm_data\python_huang_study\day014-03.03# 2) 获取指定文件夹中所有的内容
print(os.listdir(r'D:\QQ\qq聊天记录\1067279008\FileRecv'))# 3) 创建文件夹
''' os.mkdir(文件夹路径) - 只能基于有的文件夹创建下一级文件(只能创建路径中最后一个文件夹) os.makedirs(文件夹路径) - 可以创建多级文件夹(递归创建文件夹) '''
# os.mkdir(r'D:\pycharm_data\python_huang_study\day014-03.03\02test')
# os.makedirs(r'D:\pycharm_data\python_huang_study\day014-03.03\02test\01mk\01')# 删除文件夹 os.remove(路径)# 4) 返回绝对路径
''' os.path.abspath(相对路径) - 返回相对路径对应的绝对路径绝对路径: r'c:a\a\a\a'文件或者文件夹在计算机的全路径(windows电脑从盘开始写) 相对路径: r'.\a' 用.表示当前目录(当前目录指的是当前代码文件)r'..\a' 用.. 表示当前目录的上层目录 '''
print(os.path.abspath('../03模块.py'))# 5) 获取文件名 - 获取文件路径中的文件名
print(os.path.basename(r'D:\QQ\qq聊天记录\1067279008\FileRecv'),end='-----------------------')# 6) 检测路径是否有效
print(os.path.exists(r'../day013-03.02/04包.py'))# 7) 判断是否是文件或者文件夹
''' os.path.isfile('路径') - 是否是文件 os.path.isfiles('路径') - 是否是文件夹 '''# 8)把目录和文件名合成一个路径
a = r'../day013-03.02'
b = 'aaa.text'
print(os.path.join(a, b))# 9) 获取文件得扩展名
path = r'./02test/01mk/01/0101.py'
rel = os.path.splitext(path)
print(rel)
math和random
- 数学模块 - math、cmath(针对复数的数学模块)
import math,cmath
# 1) 浮点数转整数 取较大整数
# math.cell
print(math.ceil(2.234))
print(math.ceil(2.786))# math.floor(浮点数) - 取较小整数
print(math.ceil(2.12))
print(math.ceil(2.78))# round(浮点数) - 四舍五入
print(round(2.3))
print(round(2.8))# math.fabs(int/float) - 取绝对值,结果是浮点数
# abs() - 取绝对值,结果是原来数据类型
print(math.fabs(-123.21))
print(math.fabs(-2))
print(abs(-2))
print(abs(-2.88))
- 随机模块- random
随机整数: random.randint(M,N) - 产生M到N的随机整数
随机小数:random.random() -产生0-1的随机小数
random.randrange(M,N,step) - 在指定的等差数列中随机抽取一个数
random.shuffle() - 打乱顺序random.choice(序列) - 从序列中随机获取一个元素
random.choices(序列,k=) -从序列中随机获取多个元素,k=参数是获取几个元素,放回抽取
random.choices(序列,weights=,k=) -从序列中随机获取多个元素,k=参数是获取几个元素,放回抽取,weights是权重
random.sample(序列,k=个数,counts=) - 抽取指定个数元素,不放回抽取,counts设置权重'''
import random
print(random.randint(10,20))# 0-1 --> 10-15
print(random.random(),random.random()*5 + 10)
print(random.randrange(10,21,2))
a = [1, 2, 3, 4, 5, 6, 7]
random.shuffle(a)
print(a)print(random.choice(a))
print(random.choices(a,k= 2))options = ['1','2','3','再接再厉','特等奖']
rel = random.choices(options,weights=[2,5,50,1000,1],k=1)
print(rel)
rel2 = random.sample(options,k=3,counts=[1,1,1,100,1])
print(rel2)
time 模块
import time
- time.time()
time.time() - 获取时间戳 - 用指定时间到1970年1月1日0时0分0秒的时间差来表示时间,单位是秒t1 = time.time()
print(t1)
- time.localtime()
time.localtime(时间戳) - 获取本地当前时间,返回结构体时间 - 将时间戳转换成本地时间对应的结构体时间
a = (time.localtime(1611111111))
print(a.tm_year)
- time.mktime() - 返回时间戳
b = time.mktime(a)
print(b,'-----')
- time.strftime()
time.strftime(时间格式字符串,结构体时间) - 将结构体时间转换成指定格式的字符串时间
# x年x月x日
time1 = f'{a.tm_year}年{a.tm_mon}月{a.tm_mday}日'
print(time1)# x年-x月-x日
time2 = time.strftime('%Y年%m月%d日 %H:%M:%S',a)
print(time2)
time3 = time.strftime('%D',a)
print(time3)
# x年/x月/x日
- time.strptime()
t1 = '1992-3-4'
res = time.strptime(t1,'%Y-%m-%d')
print(f'{res.tm_wday+1}')
- time.sleep(秒) - 让程序暂停指定时间
datetime
import time
from datetime import datetime,timedelta
# 1. datetime类
# 1)获取当前时间
t1 = datetime.now()
print(t1,type(t1))t2 = datetime.today()
print(t2)# 2) 获取具体的时间信息
print(datetime.now().year)
print(t1.month)
print(t1.day)
print(t1.minute)
print(t1.second)
print(t1.weekday()+1)# 3) 字符串时间转datetime
res = datetime.strptime('2022年1月','%Y年%m月')
print(res,res.weekday())# 4) 将datetime转化成字符串
print(t1.strftime('%Y/%m/%d %a'),'------')# 5) 将datetime转换成结构体时间
res = t1.timetuple()
print(res)
print(time.mktime(res),'===')# 2. timedelta -完成时间的加减操作
# 注意: timedelta在完成时间加减操作的时候只能以秒、分、时、周或者天为单位
t2 = datetime.strptime('2022-12-30 23:33:33','%Y-%m-%d %H:%M:%S')
print(t2,'=-=-=-=-',type(t2))# t2 =
# 一个小时以后的时间
x= t2 + timedelta(hours=1)
print(x)# 三天后
res = t2+timedelta(days=3)
print(res)# 1h30min
res = t2+timedelta(hours=1,minutes=30)
print(res)
day15
背景: 程序中数据默认保存在运行内存中的,保存在运行内存中的数据在程序运行结束后被销毁
如果程序中的数据在程序结束后不销毁必须将数据通过文件的形式保存到磁盘中
-
数据持久化
数据持久化又叫数据本地化,就是将程序中的数据存储到文件中
常见的数据持久化工具: 数据库(.db , .sqlite)、json文件、plist文件、csv文件、excel文件、txt文件 -
文件操作 - 操作是文件内容
基本操作流程: 打开文件 --> 操作文件(读,写) --> 关闭文件
2.1 打开文件 open(file,mode='r',*,encoding=None)
open('./02homework.py',mode='r',encoding='utf-8')
# 1) file - 需要打开文件的路径(可以是绝对路径也可以是相对路径)
# 注意: 相对路径如果是./开头, ./ 可以省略open('02homework.py',mode='r',encoding='utf-8')#mode - 文件打开方式,由两组值决定文件打开后能干什么,同时决定操作文件的时候数据的类型# 第一组(能干什么): r,w,a# r - 只读# w - 只写,清空再写# a - 只写,修改# + - 读+写,r+、a+、w+# 第二组(决定数据类型): t,b# t - 字符串# b - 字节(二进制)
# 打开文本文件可以用t也可以用b,看具体需求。而二进制文件(图片,视频,音频,pdf等)只能用b,不然会报错# 使用的时候需在两组值中各选一种方式,第二组没选默认为't'。例: 'r','w','a','rb','wb'# ============w+可以变读写================
f = open('test01.txt',mode='w+')
f.write('12')
f.close()
# f.read() --报错f = open('test01.txt',mode='a')
f.write('123adf')
f.close()
# f.read() --报错f = open('test01.txt',mode='a+') # 可读可写# ============ b读写数据类型是直接(二进制)=====================# 2.2 操作文件
''' 1)读操作 文件对象.read() - 从读写位置开始读到文件结束(获取整个文件内容),返回值就是文件内容文件对象.readline() - 从读写位置开始读到一行结束(只能读文本) '''f = open('test01.txt',mode='rt',encoding='utf-8')
print(f.read())f.seek(0) #-----将文件移动到文件开头
resl = f.read()
print(resl)# 2)写操作
# 文件对象.write(数据) - 将指定的数据写入指定文件
try:f = open('test01.txt','w',encoding='utf-8')
except:f = open('test01.txt', 'w', encoding='gbk')# encoding - 文件编码方式(文本文件文字存储的时候采用的字符集);
# 只有在以t方式打开文件的时候才需要设置encoding
# 一般赋值为'utf-8' -> 数字、字母使用1字节;中文采用3个字节;表情符号采用4个字节
# 'gbk' -> 中文采用4个字节# 2.3 关闭
''' 文件操作完后要关闭文件:文件对象.close() '''
# 防止文件关闭的方法1:
res = open('test01.txt').read()# 方法2:
with open('test01.txt',mode='w+',encoding='utf-8') as f:rel = f.read()print(rel)
数据持久化
# 练习1:写程序打印程序执行次数
''' 第一步:确定需要持久化的数据 第二步:创建文件且确定文件初识内容 第三步:这程序中需要这个数据的时候后从文件中读这个数据 第四步:当这个数据发生变化以后需要将最新的额数据写入文件中 '''content = open('test01.txt',mode='rt',encoding='utf-8').read()
f = open('test01.txt',mode='wt',encoding='utf-8')
if content == '':f.write('1')content1 = '1'
else:content1 = int(content) + 1f.write(str(content1))
print(content1)# 练习2:写程序添加学生并且打印已经添加过的所有学生
''' 请输入学生姓名: 小明 小明请输入学生姓名:小花 小明 小花 '''# 练习4:写程序添加学生,并且打印已经添加过的所有学生
""" 请输入学生姓名: 小明 请输入学生电话: 110 请输入学生专业: 电子信息 [{'name': '小明', 'tel': '110', 'major': '电子信息'} ]请输入学生姓名: 小花 请输入学生电话: 119 请输入学生专业: 服装设计 [{'name': '小明', 'tel': '110', 'major': '电子信息'},{'name': '小花', 'tel': '119', 'major': '服装设计'} ] """# a = {}
# b = []
# a['name'] = input('name:')
# a['tel'] = input('tel:')
# a['major'] = input('major:')
#
# rel = eval(open('./test02.txt',mode='rt',encoding='utf-8').read())
# f = open('./test02.txt',mode='wt',encoding='utf-8')
# b.append(rel)
# b.append(a)
# f.write(str(b))
# f.close()
#
# print(rel)def demo4():a = {
}a['name'] = input('name:')a['tel'] = input('tel:')a['major'] = input('major:')try:f = eval(open('./test02.txt', mode='rt', encoding='utf-8').read())except:f = []f.append(a)print(f)open('./test02.txt', mode='wt', encoding='utf-8').write(str(f))demo4()