异常和文件

本文详细讲解了Python中的异常传播机制,包括try-except-finally语句的使用,以及如何处理文件I/O操作,如打开、读写和编码问题。特别关注了异常对象的捕捉和处理,以及不同类型的文件操作技巧。
摘要由CSDN通过智能技术生成

异常

异常的传播

  • 程序在运行的过程当中,不可以避免的出现一些错误,这些错误我们称之为异常,异常之后的代码都不会执行,防止异常的传播。
  • 处理异常 try语句
    try:
      代码块(可能出现错误的语句)
    except:
      代码块(出现错误之后要执行的语句)
    else:
      代码块(没有出现错误我要执行的语句)
print('python')
try:
    print(b)
except:
    print('出错了')
else:
    print('程序正常执行没有错误')
print('jkjkjkl')
python
出错了
jkjkjkl

异常的传播

  • 当在函数中出现了异常,如果对异常进行处理,则异常不在继续传播,如果在函数中没有处理,则异常会继续向函数调用处传播
def fn():
    print('我是fn')
    print(100/0)# division by zero
#fn()# division by zero

异常从函数的内部传播到了函数的外部

def fn1():
    print('我是fn1')
    print(100/0)# division by zero
def fn2():
    print('我是fn2')
    fn1()
def fn3():
    print('我是fn3')
    fn2()
# fn3()# division by zero
print(ZeroDivisionError)
<class 'ZeroDivisionError'>

直到传递到全局作用域,如果依然没有处理则程序终止,并且显示异常信息,当这个程序在运行过程中出现异常,所有的异常信息会保存到一个专门的异常对象中,而异常传播时,实际上就是异常对象抛给了调用处

异常对象

  • 怎么获取异常的对象?
print('异常出现前')
try:
    # print(b)
    print(100/0)
except NameError:
    # 如果在except后面不加任何的内容,此时他会捕获所有的异常
    # 如果在except后面跟着一个异常类型,那么他只会捕获该类型的异常
    print('出现了NameError错误了')
print('异常出现后')
print('出现异常前')
try:
    print(b)
except Exception as e:
    print('.......',e,type(e))
finally:
    print('无论是否出现异常,都会执行')
print('出现异常后')
出现异常前
....... name 'b' is not defined <class 'NameError'>
无论是否出现异常,都会执行
出现异常后

所有的异常都有同一个父类:Exception
此时的try语句:

try:
    代码块(可能出现的错误的语句)
except 异常类型 as 异常名:
    代码块(出现错误以后我的处理方式)
except 异常类型 as 异常名:
    代码块(出现错误以后我的处理方式)
except 异常类型 as 异常名:
    代码块(出现错误以后我的处理方式)
except 异常类型 as 异常名:
    代码块(出现错误以后我的处理方式)
.........
else:
    代码块(没有出错我要执行的语句)
finally:
    代码块(不管代码块是否异常,该代码块都会执行)

文件File

文件又称为(I/O)(Input/Output)

  • 操作文件的步骤:
    1.打开文件
    2.对文件进行读写操作
    3.关闭文件

文件的打开

  • 通过python程序来对计算机中的各种文件进行增删改查的操作
  • 通过open()函数来进行打开文件
    语法:

open(file,mode = ‘r’,buffering = None,encoding = None,errors = None,newline = None,closefd = True)
参数file 要打开的文件的名字(路径)
open()函数有一个返回值,返回的是一个对象,返回的是当前打开的文件

如果要打开的文件在py文件的同一目录下

file_name = 'demo.txt'
file_obj = open(file_name)
print(file_obj)
<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>

如果要打开的文件和py文件不在同一个目录中

file_name = r'C:\Users\张浩哲\Desktop\demo.txt'
file_obj = open(file_name)
print(file_obj)
<_io.TextIOWrapper name='C:\\Users\\张浩哲\\Desktop\\demo.txt' mode='r' encoding='cp936'>

文件的关闭

  • 当我们获取了文件对象之后,所有的操作都是通过文件对象来进行操作的
  • 读取文件的内容,通过read()函数来读取文件内容,它会将读取到的内容保存到一个字符串当中
  • 关闭文件:file_obj.close()
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(content)
file_obj.close()
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

with…as语句:可以避免因为代码过多忘记关闭文件

file_name = 'demo.txt'
with open(file_name) as file_obj:
    # 在with语句中直接使用file_obj来操作文件
    print(file_obj.read())
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
file_name = 'python'
try:
    with open(file_name) as file_obj:
        print(file_obj.read())
except FileNotFoundError:
    print(f'{file_name}文件不存在')

文件的读取

下面我们先来看一个现象

file_name = 'demo.txt'
try:
    with open(file_name) as file_obj:
        content = file_obj.read()
        print(content)
except FileNotFoundError:
    print(f'{file_name}文件不存在')
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

如果要读取的文件是英文字母,那么可以顺利的读取出来,但是如果是中文呢?

file_name = 'demo2.txt'
try:
    with open(file_name) as file_obj:
        content = file_obj.read()
        print(content)
except FileNotFoundError:
    print(f'{file_name}文件不存在')

就会进行报错
这是因为调用open()来打开一个文件,打开的文件可以分为两种类型:

  • 一种是纯文本(utf-8编写的文本文件)
  • 一种是二进制文件(图片 音频 视频 PPT)
    如何解决这个报错呢?
    可以在file_name后去指定一个文件的编码,比如说utf-8 utf-16 utf-32 gbk等等
    解决这个问题后,我们发现读取文本文件的时候如果字符占用过大,那么所占的内存也比较多,这时我们并不希望一下就可以读取全部的字符,这样做比较有隐患,那么怎么解决这件事呢?
    这时要介绍一个函数read()
  • read()可以接受一个size作为参数来进行传递
  • 默认值为-1会读取所有的字符,该参数用来指定读取字符的数量
  • 可以为size指定一个值,这样read()会读取指定的数量的字符,并且每一次读取的时候都是从上一次读取的位置来继续进行读取,如果剩余字符的数量小于size,则一下读取剩余的内容
file_name = 'demo2.txt'
try:
    with open(file_name,encoding = 'gbk') as file_obj:
        # help(file_obj.read)
        content = file_obj.read(6)
        print(content)
        print(len(content))
except FileNotFoundError:
    print(f'{file_name}文件不存在')
靠靠靠靠靠靠
6

这样一来就避免了隐患。

file_name = 'demo.txt'
try:
    with open(file_name,encoding = 'utf-8') as file_obj:
        # 定义一个变量来保存结果
        file_content = ''
        # 定义一个变量来指定读取的大小
        chunk = 5
        while True:
            content = file_obj.read(chunk)
            # 没有内容退出循环
            if not content:
                break
            file_content += content
except FileNotFoundError:
    print(f'{file_name}文件不存在')
print(file_content)
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
file_name = 'demo.txt'
with open(file_name,encoding = 'utf-8') as file_obj:
    # print(file_obj.read())
    # readline()该方法可以读取一行内容
    print(file_obj.readline(),end = '')
    print(file_obj.readline(),end = '')
    print(file_obj.readline(),end = '')
    # readlines()该方法用于一行一行的读取,他将读取的内容全部封装到一个列表当中进行返回
    r = file_obj.readlines()
    print(r)
    print(len(r))
    print(r[0])
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccc
[',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n', 'llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll']
2
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

文件的写入

  • 通过write()向文件中写入内容,如果操作的是一个文本文件,write()需要传递一个字符串,操作文件的时候要指定操作的类型
  • w表示可写,使用w写入文件的时候,如果文本不存在会创建一个文件,如果存在会覆盖原文件
file_name = 'demo.txt'
with open(file_name,'w',encoding = 'utf-8') as file_obj:
    file_obj.write('nice to meet you')
nice to meet you

如何在文件中进行追加呢?a表示追加

file_name = 'demo.txt'
with open(file_name,'a',encoding = 'utf-8') as file_obj:
    file_obj.write('nice to meet you\n')
    file_obj.write('dfadfadgg\n')
    file_obj.write('13243544\n')
    file_obj.write('gsdfgsdfgsf\n')
    file_obj.write('hkkkkl;l;iulouk\n')
nice to meet younice to meet you
dfadfadgg
13243544
gsdfgsdfgsf
hkkkkl;l;iulouk

操作二进制文件

b表示操作二进制文件
rb表示读取二进制文件
wb表示写入二进制文件
ab表示追加二进制文件

file_name = r'C:\Users\张浩哲\Desktop\果汁音乐-只听最动听的歌.mp3'
with open(file_name,'rb') as file_obj:
    # print(file_obj.read(100))
    # 定义一个新的文件
    new_name = 'abc.mp3'
    with open(new_name,'wb') as new_obj:
        # 定义一个读取的大小
        chunk = 1024 * 100
        while True:
            content = file_obj.read(chunk)
            if not content:
                break
            new_obj.write(content)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_45671732

你们鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值