Python编程_文件与异常
大纲
文件的概念与基本操作
Python异常处理方式【掌握】
内置模块与自定义模块的应用【活学活用】
学生管理系统
文件的概念
学习目标
- 理解文件的相关概述
- 理解文件的作用
什么是文件
内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了==“文件”==的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,==文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。==
思考:文件操作包含哪些内容呢?
在日常操作中,我们对文件的主要操作:创建文件、打开文件、文件读写、文件备份等等
文件操作的作用
文件操作的作用就是==把一些内容(数据)存储存放起来==,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
总结
Q1: 文件操作包括哪些内容?
- 打开文件
- 读写操作
- 关闭文件
文件的基本操作
学习目标
- 掌握绝对路径和相对路径的写法
- 掌握文件的读取相关操作
- 掌握文件的写入相关操作
open函数打开文件
在Python,使用open()函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:
1 | f = open(name, mode) |
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读r、写入w、追加a等。
r模式:代表以只读模式打开一个已存在的文件,后续我们对这个文件只能进行读取操作。如果文件不存在,则直接报错。另外,r模式在打开文件时,会将光标放在文件的第一行(开始位置)。
w模式:代表以只写模式打开一个文件,文件不存在,则自动创建该文件。w模式主要是针对文件写入而定义的模式。但是,要特别注意,w模式在写入时,光标也是置于第一行同时还会清空原有文件内容。
a模式:代表以追加模式打开一个文件,文件不存在,则自动创建该文件。a模式主要也是针对文件写入而定义模式。但是和w模式有所不同,a模式不会清空文件的原有内容,而是在文件的尾部追加内容。
文件路径:① 绝对路径 ② 相对路径
① 绝对路径:绝对路径表示绝对概念,一般都是从盘符开始,然后一级一级向下查找(不能越级),直到找到我们要访问的文件即可。
比如访问C盘路径下的Python文件夹下面的python.txt文件,其完整路径:
1 | Windows |
绝对路径一般路径固定了,文件就不能进行移动,另外在迁移过程中会比较麻烦。
② ==相对路径==:相对路径表示相对概念,不需要从盘符开始,首先需要找到一个参考点(就是Python文件本身)
同级关系:我们要访问的文件与Python代码处于同一个目录,平行关系,同级关系的访问可以使用./文件名称
或者直接写文件名称
即可
上级关系:如果我们要访问的文件在当前Python代码的上一级目录,则我们可以通过../
来访问上一级路径(如果是多级,也可以通过../../../去一层一层向上访问
下级关系:如果我们要访问的文件在与Python代码同级的某个文件夹中,则我们可以通过文件夹名称/
来访问某个目录下的文件
入门级案例
1 | # 1、打开文件 |
强调一下:中文乱码问题,默认情况下,计算机常用编码ASCII、GBK、UTF-8
解决写入中文乱码问题
1 | # 1、打开文件 |
文件的读取操作
read(size)方法
:主要用于文本类型或者二进制文件(图片、音频、视频…)数据的读取
size表示要从文件中读取的数据的长度(单位是字符/字节),如果没有传入size,那么就表示读取文件中所有的数据。
1 | f.read() # 读取文件的所有内容 |
1 | # 1、打开文件 |
readlines()方法
:主要用于文本类型数据的读取
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
1 | # 1、打开文件 |
readline()方法
:一次读取一行内容,每运行一次readline()函数,其就会将文件的指针向下移动一行
1 | f = open('python.txt’) |
聊聊文件操作的mode模式
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
虽然mode文件操作模式很多,但是我们只需要记住3个字符即可。r、w、a
r+、w+、a+,代加号,功能全,既能读,又能写(区别在于指针到底指向不同)
rb、wb、ab,代b的字符,代表以二进制的形式对其进行操作,适合读取文本或二进制格式文件,如图片、音频、视频等格式
rb+、wb+、ab+,代加号,功能全,既能读,又能写(区别在于指针到底指向不同)
总结
Q1: 文件操作相关的函数有哪些?
- 打开文件: open()
- 读取数据: read(), readline(), readlines()
- 关闭文件: close()
os模块
学习目标
- 掌握os模块常用函数
os模块使用步骤
在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:
第一步:导入os模块
1 | import os |
第二步:调用os模块中的相关方法
1 | os.函数名() |
文件操作相关方法
编号 | 函数 | 功能 |
---|---|---|
1 | os.rename(旧文件名称,新文件名称) | 对文件进行重命名操作 |
2 | os.remove(要删除文件名称) | 对文件进行删除操作 |
案例:把Python项目目录下的python.txt文件,更名为linux.txt,休眠20s,刷新后,查看效果,然后对这个文件进行删除操作。
1 | # 第一步:导入os模块 |
文件夹操作相关操作
前提:
1 | import os |
相关方法:
编号 | 函数 | 功能 |
---|---|---|
1 | os.mkdir(新文件夹名称) | 创建一个指定名称的文件夹 |
2 | os.getcwd() | current work directory,获取当前目录名称 |
3 | os.chdir(切换后目录名称) | change directory,切换目录 |
4 | os.listdir(目标目录) | 获取指定目录下的文件信息,返回列表 |
5 | os.rmdir(目标目录) | 用于删除一个指定名称的”空”文件夹 |
案例1:
1 | # 导入os模块 |
案例2:准备一个static文件夹以及file1.txt、file2.txt、file3.txt三个文件
① 在程序中,将当前目录切换到static文件夹
② 创建一个新images文件夹以及test文件夹
③ 获取目录下的所有文件
④ 移除test文件夹
1 | # 导入os模块 |
文件夹删除补充(递归删除、慎重!)
1 | # 导入shutil模块 |
递归删除文件夹的原理:理论上,其在删除过程中,如果文件夹非空,则自动切换到文件夹的内部,然后把其内部的文件,一个一个删除,当所有文件删除完毕后,返回到上一级目录,删除文件夹本身。
with-open语句
它主要是针对于 文件操作的, 即: 你再也不用手动 close()释放资源了, 该语句会在 语句体执行完毕后, 自动释放资源.
格式:
with open(‘路径’, ‘模式’, ‘码表’) as 别名, open(‘路径’, ‘模式’, ‘码表’) as 别名:
语句体
特点:
语句体执行结束后, with后边定义的变量, 会自动被释放.
案例:
1 | # 1. 打开 数据源 和 目的地文件. |
总结
Q1: OS模块的常用函数
- rename()
- remove()
- mkdir()
- getcwd()
- chdir()
- listdir()
- rmdir()
- shutil.rmtree()
文件案例
案例需求
反转文件内容.按行读取文件内容, 对每行的内容进行反转后, 写到另1个文件中.
例如:数据源文件: a.txt
1 | 数据源文件: a.txt |
实现思路
① 读取两个文件a.txt,并且将读取到的文件存储到一个列表中
② 遍历文件行中所有的内容,去除行末换行符,使用切片方式翻转内容
③ 将翻转后的内容加载到一个新的列表中
④将新列表的中的内容以文件的方式写到本地磁盘b.txt
代码实现
1 | # 1. 定义源文件路径和目标文件路径 |
巩固练习
拷贝文件并改名.例如: 把 a.py文件 拷贝到 a[备份].txt 文件中
1 | # 1. 定义源文件路径 |
Python异常
学习目标
- 掌握捕获异常的格式
什么是异常
当检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的”异常”。
异常演示
1 | # 除数为0 |
异常捕获
基本语法:
1 | try: |
try…except主要用于捕获代码运行时异常,如果异常发生,则执行except中的代码
案例:
1 | try: |
捕获异常并输出错误信息
无论我们在except后面定义多少个异常类型,实际应用中,也可能会出现无法捕获的未知异常。这个时候,我们考虑使用Exception异常类型捕获可能遇到的所有未知异常:
1 | try: |
案例:打印一个未定义变量,使用Exception异常类进行捕获
1 | try: |
异常捕获中else语句
else语句:表示的是如果没有异常要执行的代码。
1 | try: |
案例:
1 | try: |
异常捕获中的finally语句
finally表示的是无论是否异常都要执行的代码,例如关闭文件
1 | try: |
异常案例
案例需求
升级猜数字游戏,增加程序健壮性,用户在输入过程中可能不会输入数字或者不按照要求输入,程序要能捕获到用户的异常输入。在已有的猜数游戏中加入异常功能。
实现思路
①使用python异常捕获try…except,捕获用户异常输入
代码实现
1 | import random |
总结
Q1: 什么是异常?
- Python中, 把程序出现的所有非正常情况, 统称为异常.
Q2: 掌握捕获异常的格式.
try:
可能出现问题的代码
Except exception as e:
出现问题后的解决方案
else:
如无异常, 则会执行这里的内容
finally:
无论是否有问题, 都会执行这里的内容.
Python内置模块
学习目标
- 理解Python模块的概念
- 掌握Python导入模块的方式
什么是Python模块
Python 模块(Module),是一个==Python 文件==,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义==函数,类和变量==,模块里也能包含可执行的代码。
1 | import os => os.py |
在Python中,模块通常可以分为两大类:==内置模块(目前使用的)== 和 ==自定义模块==
模块的导入方式
☆ import 模块名
☆ import 模块名 as 别名
☆ from 模块名 import *
☆ from 模块名 import 功能名
使用import导入模块
基本语法:
1 | import 模块名称 |
使用模块中封装好的方法:
1 | 模块名称.方法() |
案例:使用import导入math模块
1 | import math |
案例:使用import导入math与random模块
1 | import math, random |
普及:我们在Python代码中,通过import方式导入的实际上都是文件的名称
使用as关键字为导入模块定义别名
在有些情况下,如导入的模块名称过长,建议使用as关键字对其重命名操作,以后在调用这个模块时,我们就可以使用别名进行操作。
1 | import time as t |
在Python中,如果给模块定义别名,命名规则建议使用大驼峰。
使用from…import导入模块
提问:已经有了import导入模块,为什么还需要使用from 模块名 import 功能名这样的导入方式?
答:import代表导入某个或多个模块中的所有功能,但是有些情况下,我们只希望使用这个模块下的某些方法,而不需要全部导入。这个时候就建议采用from 模块名 import 功能名
☆ from 模块名 import *
这个导入方式代表导入这个模块的所有功能(等价于import 模块名)
1 | from math import * |
☆ from 模块名 import 功能名(推荐)
1 | from math import sqrt, floor |
注意:以上两种方式都可以用于导入某个模块中的某些方法,但是在调用具体的方法时,我们只需要功能名()
即可
1 | 功能名() |
案例:
1 | # from math import * |
time模块中的time()方法
在Python中,time模块除了sleep方法以外,还有一个方法叫做time()方法
1 | time.time() |
主要功能:就是返回格林制时间到当前时间的秒数(时间戳)
案例:求循环代码的执行时间
1 | import time |
总结
Q1: 模块指的是什么?
- Python中, 把.py文件称之为模块.
Q2: 导入模块有哪些方式?
- import …. as 别名
- from … import … as 别名
Python中的自定义模块
学习目标
- 理解什么是自定义模块
什么是自定义模块
在Python中,模块一共可以分为两大类:内置系统模块 和 自定义模块
模块的本质:在Python中,模块的本质就是一个Python的独立文件(后缀名.py),里面可以包含==全局变量、函数以及类==。
注:在Python中,每个Python文件都可以作为一个模块,模块的名字就是==文件的名字==。也就是说自定义模块名必须要符合标识符命名规则。
特别注意:我们在自定义模块时,模块名称不能为中文,不能以数字开头,另外我们自定义的模块名称不能和系统中自带的模块名称(如os、random)相冲突,否则系统模块的功能将无法使用。比如不能定义一个叫做os.py模块
定义一个自定义模块
案例:在Python项目中创建一个自定义文件,如my_module.py
1 | def sum_num(num1, num2): |
导入自定义模块
1 | import 模块名称 |
案例:
1 | import my_module |
Python模块案例
案例需求
在python中,创建A模块定义求和函数, 在B模块中调用A模块中的函数.
代码实现
1 | # module_a.py |
巩固练习
在python中,创建A模块定义打印水仙花数函数, 在B模块中调用.
1 | """ |
学生管理系统
案例需求
使用python语言实现学生管理系统,要求进入系统显示系统功能界面,功能如下:
1 | 添加学生信息 |
系统共6个功能,用户根据自己需求选取,实现该需求
实现思路
①构建系统功能菜单界面封装函数
②使用函数封装功能实现对学生信息添加、删除、修改、查询、遍历和退出
代码实现
1 | # 1. 定义函数 print_info() , 打印提示信息. |