基础
Grundlagen-15, Ausnahmen und Dateien
- 一、异常
- 1、异常的简介
- 2、异常的传播
- 3、异常对象
- 二、文件
- 1、文件的打开
- 2、文件的关闭
- 3、文件的读取
- 1、读取文件
- 2、较大文件的读取
- 4、文件的写入
- 5、二进制文件的写入
一、异常
1、异常的简介
- 程序在运行过程中可能会出现一些错误。比如:使用了不存在的索引,两个不同类型的数据相加。。。。这些错误我们称之为异常。
- 处理异常:程序在运行时出现异常,目的并不是让我们的程序直接终止!Python是希望在出现异常时,我们可以编写代码来对异常进行处理。
- 代码演示:
print('hello world')
try:# print(a)print(2)
except:print('哎哟,这个代码写错了呀!!!')
else:print('没有问题真好')print('hello python')# try....except语句,捕获异常的语句# try: 代码块,可能出错的语句 没有出错正常执行
# except: 代码块, 出错以后我的处理方案
# else: 代码块 没有出错我要执行的语句
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/异常的简介.py
hello world
2
没有问题真好
hello pythonProcess finished with exit code 0
2、异常的传播
- 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会在进行传播。如果函数中没有对异常进行处理,则异常会继续向函数调用传播。如果函数调用处处理了异常,则不再传播异常,如果没有处理则继续向调用处传播。直到传递到全局作用域(主模块)如果依然没有处理,则程序终止,并显示异常信息。
- 当程序运行过程中出现异常以后,所有异常信息会保存到一个异常对象中。而异常传播时,实际上就是异常对象抛给了调用处。
- 代码演示:
def fun():print('我是fun函数')# try:# # print(1 / 0) # try尝试执行可能出错的代码,如果没错,直接执行,有错不在执行# print(1) # try尝试执行可能出错的代码,如果没错,直接执行,有错不在执行# except:# print('哎呀,出错了呀') # try语句出错了,except语句就执行# else:# print(111111) # 没有出错就会执行的代码print(1 / 0)def fun1():print('我是fun1函数')fun()def fun2():print('我是fun2函数')fun1()def fun3():print('我是fun1函数')# try:# fun2()# except:# print('广大群众请放心,不会出错的')# try:
# fun3()
# except:
# print('广大群众请放心,不会出错的')fun2()
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/异常的传播.py
我是fun2函数
我是fun1函数
我是fun函数
Traceback (most recent call last):File "D:\PycharmProjects\基础班第11期\day-15\上课代码\异常的传播.py", line 36, in <module>fun2()File "D:\PycharmProjects\基础班第11期\day-15\上课代码\异常的传播.py", line 21, in fun2fun1()File "D:\PycharmProjects\基础班第11期\day-15\上课代码\异常的传播.py", line 16, in fun1fun()File "D:\PycharmProjects\基础班第11期\day-15\上课代码\异常的传播.py", line 11, in funprint(1 / 0)
ZeroDivisionError: division by zeroProcess finished with exit code 1
3、异常对象
- 语法:
try语句try:代码块(可能出现错误的语句)except 异常类型 as 异常名:代码块(出现错误以后的处理方式)except 异常类型 as 异常名:代码块(出现错误以后的处理方式)except 异常类型 as 异常名:代码块(出现错误以后的处理方式)....else:代码块(没出错时要执行的语句)finally:代码块(是否出错该代码块都会执行)try是必须的 else有没有都可以except和finally至少有一个
代码练习:
print('hello world')
try:print(a)print(1/0)
# 当我们有多个except处理异常的时候,只会处理一个异常
except NameError: # 捕获NameError的错误print('哎哟,这个代码写错了呀!!!')
except ZeroDivisionError:print('你这个0真是傲娇')else:print('没有问题真好')print('hello python')print('hello world')
try:# print(a)print(1/0)
except Exception as e:print('我的功能是最强大的', e, type(e))
else:print('没有问题真好')print('hello python')
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/异常对象.py
hello world
哎哟,这个代码写错了呀!!!
hello python
hello world
我的功能是最强大的 division by zero <class 'ZeroDivisionError'>
hello pythonProcess finished with exit code 0
- 总结:
- AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
- NameError:试图访问的变量名不存在
- SyntaxError:语法错误,代码形式错误
- Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。
- IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误
- KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误
- IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引
- TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
- ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误
- ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。
二、文件
1、文件的打开
- 文件(file)通过Python程序来对计算机的各种文件进行增删改查的操作。
- 文件也叫I/O(Input/Output)
- 文件的操作步骤:
- 打开文件
- 对文件进行各种操作(读、写)然后保存。
- 关闭文件
- 文件会有一个返回值。返回一个对象,这个对象就表示的是当前打开文件。
open
是打开文件
代码演示(绝对路径):
file_name = 'D:\PycharmProjects\基础班第11期\demo-1'
file_obj = open(file_name)
print(file_obj)
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码练习/打开文件.py
<_io.TextIOWrapper name='D:\\PycharmProjects\\基础班第11期\\demo-1' mode='r' encoding='cp65001'>Process finished with exit code 0
代码演示(相对路径):
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码练习/打开文件.py
<_io.TextIOWrapper name='..\\..\\demo-1' mode='r' encoding='cp65001'>Process finished with exit code 0
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码练习/打开文件.py
<_io.TextIOWrapper name='..\\..\\demo-1' mode='r' encoding='cp65001'>Process finished with exit code 0
2、文件的关闭
- 调用close()方法来关闭文件
- with…as 语句不用写close()来关闭。它自带关闭
代码演示(close()方法):
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(content)
#
# file_obj.close()
#
# file_obj.read()
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/关闭文件.py
两袖清风怎敢误佳人Process finished with exit code 0
代码演示(close()方法):
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(content)
#
file_obj.close()
file_obj.read()
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/关闭文件.py
两袖清风怎敢误佳人
Traceback (most recent call last):File "D:\PycharmProjects\基础班第11期\day-15\上课代码\关闭文件.py", line 7, in <module>file_obj.read()
ValueError: I/O operation on closed file.Process finished with exit code 1
上述错误的意思:
追溯(最近一次通话):文件“ D:\ PycharmProjects \基础班第11期\ day-15 \上课代码\关闭文件.py”,第7行,在<module>中file_obj.read()
ValueError:对关闭的文件进行I / O操作。
表示文件未打开无法读取。
代码演示(with open as f):
file_name = 'demo.txt'
try:with open(file_name) as f:content = f.read()print(content)
except FileNotFoundError:print(f'{file_name}文件不存在')f.read()
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/关闭文件.py
Traceback (most recent call last):File "D:\PycharmProjects\基础班第11期\day-15\上课代码\关闭文件.py", line 20, in <module>f.read()
ValueError: I/O operation on closed file.
一生清贫怎敢恋繁华,
两袖清风怎敢误佳人。
三餐不济怎敢叙高堂,
四季漂离怎敢言家成。
五行缺钱愁从心中生,
六道不济万事难如意。
七窍玲珑阅尽天下人,
八百孤寒难守炽情归.
九朝同歌弃往世悔憾,
十载梦离奔心之所往。Process finished with exit code 1
错误提示与上述相同。
3、文件的读取
1、读取文件
- 通过read()来读取文件的内容
- 调用open()来打开一个文件,可以将文件分为2中类型
- 一种 纯文本文件(使用utf-8编码编写的文件)
- 一种 二进制文件(图片 mp3 视频…)
- open()打开文件时,默认是以文本文件的形式打开的 open()默认的编码为None。所以处理文本文件时要指定编码
2、较大文件的读取
- 通过read()读取文件内容时会将文件中所有的内容全部读取出来。如果对于读取的文件比较大的话。会一次性的将文件加载到内容中。容易导致内存泄露。所以对于较大的文件。不要直接调用read()
- read()可以接收一个size作为的参数。该参数用来指定要读取字符的数量。默认值为-1.-1也就是要读取全部的内容
- 每次读取都会从上次读取到的位置开始。如果字符的数量小于size。则会读取所有的。如果读取到最后的文件。则会返回空串
- readline() 该方法用来读取一行
- readlines() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表当中返回
代码演示(read()方法):
demo:
一身清贫怎敢入繁华,
两袖清风怎敢误佳人!
三生有幸怎敢遇见你,
四目相对怎敢目无你,
五行皆空怎敢奢求你,
六道轮回怎敢忘记你。
演示1:
file_name = 'demo.txt'
try:with open(file_name, encoding='utf-8') as f:# content = f.read(8)content = f.read()print(content)
except FileNotFoundError:print(f'{file_name}文件不存在')
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/文件的读取.py
一身清贫怎敢入繁华,
两袖清风怎敢误佳人!
三生有幸怎敢遇见你,
四目相对怎敢目无你,
五行皆空怎敢奢求你,
六道轮回怎敢忘记你。Process finished with exit code 0
演示2:
file_name = 'demo.txt'
try:with open(file_name, encoding='utf-8') as f:# content = f.read(8)content = f.read(8)print(content)
except FileNotFoundError:print(f'{file_name}文件不存在')
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/文件的读取.py
一身清贫怎敢入繁Process finished with exit code 0
代码演示(readline()):
demo:
一身清贫怎敢入繁华,
两袖清风怎敢误佳人!
三生有幸怎敢遇见你,
四目相对怎敢目无你,
五行皆空怎敢奢求你,
六道轮回怎敢忘记你。
file_name = 'demo.txt'
try:with open(file_name, encoding='utf-8') as f:for i in range(6):content = f.readline()print(content)
except FileNotFoundError:print(f'{file_name}文件不存在')
打印输出结果:
E:\python\python.exe D:/PycharmProjects/基础班第11期/day-15/上课代码/文件的读取.py
一身清贫怎敢入繁华,两袖清风怎敢误佳人!三生有幸怎敢遇见你,四目相对怎敢目无你,五行皆空怎敢奢求你,六道轮回怎敢忘记你。Process finished with exit code 0
4、文件的写入
- write()来向文件中写入内容
- 该方法可以分多次向文件写入内容
- 写入完成之后该方法会返回写入的字符的个数
- 使用open()函数打开文件时,必须要指定打开文件要做的操作(读、写、追加)。如果不指定操作类型,则默认是读取文件,而读取文件是不能向文件中写入
- r–表示只读
- w–表示可以写。使用w写入文件时,如果文件不存在则会创建一个文件。如果文件存在则会覆盖原文件内容
- a–追加写入
代码演示(w演示):
demo:
一身清贫怎敢入繁华,
两袖清风怎敢误佳人!
三生有幸怎敢遇见你,
四目相对怎敢目无你,
五行皆空怎敢奢求你,
六道轮回怎敢忘记你。
file_name = 'demo.txt'
# 'w'覆盖式写入
with open(file_name, 'w', encoding='utf-8') as f:f.write('一生清贫怎敢恋繁华,\n两袖清风怎敢误佳人。\n三餐不济怎敢叙高堂,\n四季漂离怎敢言家成。\n五行缺钱愁从心中生,\n六道不济万事难如意。')
打印输出结果:
demo:
一生清贫怎敢恋繁华,
两袖清风怎敢误佳人。
三餐不济怎敢叙高堂,
四季漂离怎敢言家成。
五行缺钱愁从心中生,
六道不济万事难如意。
代码演示(a演示):
demo:
一生清贫怎敢恋繁华,
两袖清风怎敢误佳人。
三餐不济怎敢叙高堂,
四季漂离怎敢言家成。
五行缺钱愁从心中生,
六道不济万事难如意。
file_name = 'demo.txt'# 'a'追加式写入
with open(file_name, 'a', encoding='utf-8') as f:f.write('\n七窍玲珑阅尽天下人,\n八百孤寒难守炽情归.\n九朝同歌弃往世悔憾,\n十载梦离奔心之所往。')
打印输出结果:
demo:
一生清贫怎敢恋繁华,
两袖清风怎敢误佳人。
三餐不济怎敢叙高堂,
四季漂离怎敢言家成。
五行缺钱愁从心中生,
六道不济万事难如意。
七窍玲珑阅尽天下人,
八百孤寒难守炽情归.
九朝同歌弃往世悔憾,
十载梦离奔心之所往。
5、二进制文件的写入
- 读取文本文件时,size是以字符为单位。读取二进制文件时,size是以字节为单位
- 我们用wb来写入二进制文件
file_name = r'Users/wangjiaxin/Desktop\LindseyStirling_Artemis.ncm'with open(file_name, 'rb') as f:# print(f.readline())new_file = '123.mp3'with open(new_file, 'wb') as f1:while True:content = f.read(1024 * 1000)if not content:breakf1.write(content)