异常与文件

一、异常的简介

  • 异常的简介:
  • 程序在运行过程中可能会出现一些错误。比如:使用了不存在的索引,两个不同类型的数据相加。。。这些错误我们称之为异常。
  • 处理异常:
  • 程序运行时出现异常,目的并不是让我们的程序直接终止! python是希望在出现异常时,我们可以编写代码来对异常进行处理。
    演示1:
import requests
print('python')
# try代码的意思时尝试执行以下代码,如果代码不会出错,就直接执行try内部的代码;如果出错,则执行except内部的代码。
try:
    response = requests.get('www.baidu.com')
    print(response)
except:
    print('代码出错才会执行本语句!')
else:
    print('代码没有出错')
print('pycharm')

打印输出结果:

python
代码出错才会执行本语句!
pycharm

演示2:

import requests
print('python')
# try代码的意思时尝试执行以下代码,如果代码不会出错,就直接执行try内部的代码;如果出错,则执行except内部的代码。
try:

    print(111)
except:
    print('代码出错才会执行本语句!')
else:
    print('代码没有出错')
print('pycharm')

打印输出结果:

python
111
代码没有出错
pycharm
  • 处理异常的语法:
try:
    代码块(可能出错的代码块):出错了就不执行,没有错就执行
except:
    代码块(出错了就执行的语句,没有出错就不执行)
else:
    代码(没有出错就执行,出错了就不执行)

二、异常的传播

  • 异常的传播:
  • 1、当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会传播。如果函数中没有对异常进行处理,则异常会继续祥函数调用传播。如果函数调用处处理了异常,则不会=传播异常,如果没有处理则继续向调用处传播。知道传播到全局作用域(主模块)如果依然没有处理,则程序终止,并显示异常信息。
  • 2、当程序运行过程中出现异常以后,所有异常信息会保存到一个异常对象中。而异常传播时,实际上就是异常对象抛给了调用处。
    演示1:
def fn():
    print('我是fn')
    try:
        a = 1 / 0
    except:
        print('代码出错了')

fn()

打印输出结果:
我是fn
代码出错了

演示2:

def fn():
    print('我是FN')
    a = 1 / 0

try:
    fn()
except:
    print('代码出错运行此行')

打印输出结果:
我是FN
代码出错运行此行

演示3:

def fn():
    print('我是fn')
    a = 1 / 0


def fn1():
    print('我是fn1')
    fn()


def fn2():
    print('我是fn2')
    fn1()


def fn3():
    print('我是fn3')
    fn2()


fn3()

打印输出结果:

Traceback (most recent call last):
  File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 47, in <module>
    fn3()
  File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 44, in fn3
    fn2()
  File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 39, in fn2
    fn1()
  File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 34, in fn1
    fn()
  File "D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十五讲\2--异常的传播.py", line 29, in fn
    a = 1 / 0
ZeroDivisionError: division by zero
我是fn3
我是fn2
我是fn1
我是fn

结论:当出现类似于继承关系的函数某一处结果出现错误,那么之后的函数都会报错。

三、异常对象

  • ZeroDivisionError捕获除零错误异常。
  • NameError捕获未声明初始化变量异常
  • Exception捕获所有异常。
    演示1:
print('异常出现之前')
try:
   # print(response)
   a = 1 / 0
except ZeroDivisionError:
    print('代码出错了')
print('异常出现之后')

打印输出结果:

异常出现之前
代码出错了
异常出现之后

总结:
ZeroDivisionError代表着可捕获除零错误异常。
ZeroDivisionError只会捕获ZeroDivisionError的异常,并不会捕获其他的异常。

演示2:

print('异常出现之前')
try:
   print(response)
   # a = 1 / 0
except NameError:
    print('代码出错了')
print('异常出现之后')

打印输出结果:

异常出现之前
代码出错了
异常出现之后

总结:
NameError代表着可捕获未声明初始化变量异常。
NameError只会捕获NameError的异常,并不会捕获其他的异常。

演示3:

# print('异常出现之前')
# try:
#    print(response)
#    a = 1 / 0
# except ZeroDivisionError:
#     print('ZeroDivisionError异常')
# except NameError:
#     print('NameErrory异常')
# print('异常出现之后')

打印输出结果:

异常出现之前
NameErrory异常
异常出现之后

总结:
什么类型的异常先出现,就执行捕获什么异常。后续的异常将不再捕获。

演示4:

print('异常出现之前')
try:
   print(response)
   a = 1 / 0
   print(1 + 'a')
except Exception as e:
    print('类型错误', e, type(e))
print('异常出现之后')

打印输出结果:

异常出现之前
类型错误 name 'response' is not defined <class 'NameError'>
异常出现之后
  • 语法:
try::
    代码块(可能出错的代码):出错了就不执行,没有错就执行。
except:
    代码块(出错了就执行的语句,没出错就不执行)
except Exception as e:
    代码块(出现异常我们的处理方式)
finally:
    代码块(是否有异常,都会执行)

注意 :except和finally至少有一个

四、打开文件

  • 文件的打开:
  • 文件(file)通过通过Python程序对计算机中的各种文件进行增删改查的操作。文件也叫I/O(input/output)
  • 文件的操作:
  • 1、打开文件
  • 2、对文件进行各种操作(读、写、然后保存)
  • 3、关闭文件
  • 文件会有一个返回值。返回一个对象,这个对象就表示的当前文件。
    演示1:
    创建一个在目标目录内部的文件demo
file_name = 'demo'
response = open(file_name)
print(response)

打印输出结果:
<_io.TextIOWrapper name=‘demo’ mode=‘r’ encoding=‘UTF-8’>

演示2:Windows10绝对路径

file_name = 'D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十四将\demo'
response = open(file_name)
print(response)

D:\PycharmProjects\wangjiaxin\Python-Cheney老师基础讲解\第十四将\demo–这个就是绝对路径。

演示3:macos结对路径

file_name = '/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十四将/demo'
response = open(file_name)
print(response)

/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十四将/demo–这个就是绝对路径。

演示4:相对路径

file_name = '..\第十四讲\demo'
response = open
print(response)

打印输出结果:

五、关闭文件

演示1:普通模式

  • close()方法关闭文件
file_name = 'demo'
resp = open(file_name)

content = resp.read()
print(content)
# 关闭文件
resp.close()
print(resp.read())

打印输出结果:

/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py
12580
Traceback (most recent call last):
  File "/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py", line 9, in <module>
    print(resp.read())
ValueError: I/O operation on closed file.

演示2:升级模式

  • with。。as语句不用写close()来关闭。带有自动关闭。
file_name = 'demo'
with open(file_name) as resp:
    content = resp.read()
    print(content)

respose = resp.read()
print(respose)

打印输出结果:

/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py
Traceback (most recent call last):
  File "/Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py", line 19, in <module>
    respose = resp.read()
ValueError: I/O operation on closed file.
12580

演示3:高级模式

file_name = 'demo1'
try:
    with open(file_name) as resp:
        content = resp.read()
        print(content)
except Exception as e:
    print('没有这个文件', type(e))

打印输出结果:

/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/5--关闭文件.py
白日依山尽
黄河入海流
欲穷千里目
更上一层楼

在这里插入图片描述

六、读取文件

  • 读取文件:
  • 通过read()来读取文件的内容
  • 调用open()来打开一个文件,可以将文件分为2中类型
    • 一种 纯文本文件(使用utf-8编码编写的文件)
    • 一种 二进制文件(图片 mp3 视频…)
    • open()打开文件时,默认是以文本文件的形式打开的 open()默认的编码为None。所以处理文本文件时要指定编码
  • 较大文件的读取:
  • 通过read()读取文件内容时会将文件中所有的内容全部读取出来。如果对于读取的文件比较大的话。会一次性的将文件加载到内容中。容易导致内存泄露。所以对于较大的文件。不要直接调用read()。
  • read()可以接收一个size作为的参数。该参数用来指定要读取字符的数量。默认值为-1.-1也就是要读取全部的内容。
  • 每次读取都会从上次读取到的位置开始。如果字符的数量小于size。则会读取所有的。如果读取到最后的文件。则会返回空串。
  • readline() 该方法用来读取一行。
  • readline() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表当中返回。
    演示1:
    在这里插入图片描述
file_name = 'demo1'
try:
	with open(file_name) as resp:
		content = resp.read()
		print(content)
except FileExistsError:
	print(f'{file_name}文件不存在')

打印输出结果:
白日依山尽
黄河入海流
欲穷千里目
更上一层楼

  • open可以打开的文件类型:

    • 1、纯文本(使用utf-8编写的文本文件)
    • 2、别的二进制文件(图片、视频、音乐)
  • 其他文件的读取方式: readline() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表当中返回。

演示:

file_name = 'demo1'

try:
    with open(file_name) as resp:
        for i in range(6):
            content = resp.readline()
            print(content,end='')
except FileExistsError:
    print(f'{file_name}文件不存在')

七、文件的写入

  • write()来向文件中写入内容
    • 该方法可以分多次向文件写入内容。
    • 写入完成之后该方法会返回写入字符的个数
  • 使用open()函数打开文件时,必须要指定打开文件要做的操作(读、写、追加)。如果不指定操作类型,则默认是读取文件,而读取文件是不能想文件中写入。
    • r 表示只读
    • w 表示可写。使用w写入文件时,如果文件不存在则会创建一个文件。如果文件存在则会覆盖原文件的内容。
    • a 表示追加。
      演示1:
file_name = 'demo1'

# 'w'是覆盖式写入的意思
try:
    with open(file_name, 'w', encoding='utf-8') as resp:
        content = resp.write('123\n')
        content = resp.write('456\n')
        content = resp.write('789\n')
except:
    print('出错了')

打印输出结果:

/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/wangjiaxin/Python-Cheney老师基础讲解/第十五讲/9--文件的写入.py

Process finished with exit code 0

演示2:

file_name = 'demo1'

# 'a'是追加的意思
try:
    with open(file_name, 'a', encoding='utf-8') as resp:
        content = resp.write('123\n')
        content = resp.write('456\n')
        content = resp.write('789\n')
except:
    print('出错了')

打印输出结果:

123
456
789
123
456
789

在这里插入图片描述

八、二进制文件

  • 读取文本文件时,size是以字符为单位。读取二进制文件时,size是以字节为单位
  • 我们用wb来写入二进制文件
    演示:
file_name = r'/Users/wangjiaxin/Desktop/111.ncm'

# rb时读写二进制文件的意思
try:
    with open(file_name, 'rb') as resp:
        new_file = '124.mp3'
        # print(resp.read())
        # wb写入二进制文件

        with open(new_file, 'wb') as f:
            while True:
                content = resp.read(1024*800)
                if not content:
                    break
                f.write(content)



except:
    print('出错了')

因为格式 转换的问题,这个程序没有结果。

猜你喜欢

转载自blog.csdn.net/Rhymeplot__JDQS/article/details/109299195