Python零基础之异常处理和文件处理

异常

1. 异常的简介

  • 在程序的运行过程中出现的错误就是异常
  • 异常会导致程序终止,异常以后的代码都不会去执行
  • 异常处理
# try 语句结构
try:
	代码块 # 可能出现错误的语句
except:
	代码块 # 出现错误以后的处理方式
else: # 可选
	代码块 # 没有出错要执行的语句
  • 代码示例:
print('haha')
# b = 123
try:
    print(b)
except:
    print('error')
else:
    print('code is right')
print('good')

2. 异常的传播

  • 函数中出现了异常,如果进行了异常处理,异常不会传播
  • 如果未对异常进行处理,则会继续向函数调用处传播
  • 异常处理可以在函数内,也可以在全局
  • 代码示例:
def fn1():
    print('我是fn1')
    print(100 / 0)


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


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

try:
    fn3()
except:
    pass

我是fn3
我是fn2
我是fn1

  • 异常在函数间传播,直到传播到最外层调用函数处
  • 实际上,异常信息会被存储在异常对象中,在异常传播时,异常对象会被抛给调用处

3. 异常对象

  • 如果在except后不加任何内容,则会捕获所有的异常
  • 异常的捕获是按照错误出现的先后顺序的
  • 如果指定了except后的异常类型,则只有该类型的异常才会被处理。在try中该类型之前未被处理的异常仍会报错,但该异常程序之后的异常会被忽略
  • 所有异常类型的父类是Exception
  • 可以通过指定异常对象,打印异常内容和类型的方式获取具体异常的内容
    • except Exception as e:
      • print(e,type(e))
  • 代码示例
print('异常出现前...')

try:
    print(b)
    print(100 / 0)
# 指定异常对象,并打印异常的内容和类型
except Exception as e:
    print('抛出所有异常啦',e,type(e))
# except NameError:
#     print('出现NameError的错误了')
# except ZeroDivisionError:
#     print('出现ZeroDivisionError的错误了')

print('异常出现后...')
  • finally:

    • 无论出现什么异常,我都会执行
  • 所以完整的异常处理格式为:

try:
	代码块 # 可能出现异常的代码
except 异常类型 as 异常名:
	代码块 # 出现异常后的处理方式
else# 当异常没有出现时执行
	代码块
finally: # 无论是否出现异常,finally后的代码块都执行
	代码块

文本文件的操作

1. 打开文件

  • 打开文件
    • open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
    • 返回值为当前打开的文件
  • 参数file: 要打开的文件名
    • 如果打开的文件不存在或错误,则会报错:
    • FileNotFoundError: [Errno 2] No such file or directory: ‘dem12o.txt’
      file_name = ‘demo.txt’
    • 文件完整路径前最好加上r,防止转义\n等特殊字符
    • open()默认是以纯文本文件(ASCII)打开,中文需要指定编码格式
# 打开文件
file_name = r'F:\python3.6程序\demo.txt'

# 返回值为当前打开的文件
file_obj = open(file_name) # _io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'
print(file_obj)

2. 读取文件内容

2.1 read()

  • 文件对象.read()
  • read(size=-1, /)
    • size为指定读取字符的数量,默认值-1表示读取所有
    • 可以为size指定与1个值,read()会读取指定数量的字符
    • 每次读取均从上次读取后的位置来读取
    • 如果剩余字符数量小于size,则一次读取剩余内容
    • 返回内容为字符串
  • 代码示例:、
file_name = r'F:\python3.6程序\demo.txt'
# 文件已打开,此后所有的操作都是通过文件对象进行操作
file_obj = open(file_name)
# 通过read()函数读取文件的内容,会返回一个str类型的字符串
content = file_obj.read()
print(content)
file_name = 'demo2.txt'

try:
    with open(file_name,encoding='utf-8') as file_obj:
    	# 对较大文件应当限制一次读取的内容数量
    	# 为了避免一次性读取内容过多
        file_content = ''
        # 定义一个变量来读取指定的大小
        chunk = 100
        while True:
            content = file_obj.read(chunk)
            if not content:
                break
            file_content += content
            # 打印如果放在循环内会导致多次打印,效率低
            
except FileNotFoundError:
    print(f'{file_name}文件不存在')
# 最好把打印放在代码外边,一次打印出来
print(file_content)

2.2 readline()

  • readline() 方法用于读取一行内容
  • 可以通过循环输出内容

2.3 readlines()

  • readlines() 方法用于逐行读取,返回每行的内容到列表中
  • 可以通过循环或者遍历输出内容

3. 关闭文件

  • 关闭文件的目标是为了释放资源
  • 文件对象.close()
  • 代码示例
file_obj.close()
# 关闭以后,文件就无法读取了,报错
# ValueError: I/O operation on closed file.
file_obj.read()

4. 上下文管理器

  • with … as …
  • 通过上下文管理器实现自动关闭文件
file_name = r'F:\python3.6程序\demo.txt'
with open(file_name) as file_obj:
    # 使用file_obj进行文件操作
    print(file_obj.read())
    # 自动close,不需要进行close()操作了
# 因为文件已经关闭,所以无法再读取
# ValueError: I/O operation on closed file.
print(file_obj.read())

5. 文件操作标准格式

  • 文件操作应当加入打开文件找不到时的异常处理
file_name = 'xxx'
try:
	with open(file_name) as file_obj:
		文件对象操作代码块
except FileNotFoundError:
	print(f'{file_name}文件不存在'

6. 文件的写入

6.1 ‘w’

  • 文件打开模式’w’可写,只能传入字符串
  • 如果文件不存在会自动创建文件
  • 如果存在则覆盖后,向后写入
  • 只有with open动作会覆盖,with open内的内容会继续向后追加
file_name = 'demo1.txt'

with open(file_name,'w',encoding='utf-8') as file_obj:

    # write()向文件写入内容
    # 如果写入的内容为文本,write()需要传递一个字符串
    # 操作文件的时候要指定操作的类型
    # file_obj.write('nice to meet you')
    file_obj.write('abc\n')
    file_obj.write('def\n')
    file_obj.write('hij\n')
    # 当传入数字时,由于不是字符串会报错,需要类型转换
    # TypeError: write() argument must be str, not int
    r = file_obj.write(str(666)+'\n')
    # write的返回值为此次write()操作写入的字符数量
    print(r)

with open(file_name,'r',encoding='utf-8') as file_obj:
    file_content = file_obj.read()
    print(file_content)

4
abc
def
hij
666

6.2 ‘a’

  • ‘a’表示追加,在原有内容后继续追加数据
file_name = 'demo1.txt'
with open(file_name,'a',encoding='utf-8') as file_obj:
    file_obj.write('123\n')
    file_obj.write('456\n')
    file_obj.write('789\n')
    r = file_obj.write(str(666)+'\n')

with open(file_name,'r',encoding='utf-8') as file_obj:
    file_content = file_obj.read()
    print(file_content)
  • 输出结果显示文件写入是在文件之前的内容后继续追加

abc
def
hij
666
123
456
789
666

6.3 ‘rb’和’wb’

  • ’rb’读取二进制文件
    • 音乐,图像,视频均为二进制文件
    • 读取时注意限制read(size),避免一次性读取过多内容
  • 'wb’写入二进制文件
  • 代码示例:
file_name = r'F:\python3.6程序\平凡之路.mp3'

# 'rb'读取二进制文件
# 图像,音乐,视频均为二进制文件
with open(file_name,'rb') as file_obj:
    # UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 111: illegal multibyte sequence
    # print(file_obj.read(100))

    # 定义一个新文件
    newmp3_name = 'abc.mp3'
    with open(newmp3_name,'wb') as newmp3_obj:

        # 定义读取大小,读取100kb的数据
        chunk = 100 * 1024
        while True:
            content = file_obj.read(chunk)
            if not content:
                break
            newmp3_obj.write(content)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kingx3

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

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

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

打赏作者

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

抵扣说明:

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

余额充值