python学习笔记(九)——文件和异常(重点)

学文件的目的:数据不能可能一直在内存中存储,持久化存储到磁盘就需要用到文件了!

一、文件和上下文管理器(重点)

1、打开文件—open() 方法

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file, mode='r')

完整的语法格式为:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

常用mode 参数;

模式描述
r以只读方式打开,文件指针默认放在文件开头,文件不存在则报错
r+打开一个文件用于读写,文件指针默认放在文件开头,文件不存在则报错
w打开一个文件只用于写入,如果该文件已存在则将其覆盖(你可以理解为之前写的内容会被覆盖),如果不存在,创建新文件
w+打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在,创建新文件
a打开一个文件 用于追加,如果文件存在,文件指针会放到文件结尾(也就是说,新的内容将会被写入到已有内容之后),如果不存在,创建新文件进行写入
a+打开一个文件用于读写,如果文件存在,文件指针会放到文件结尾,如果不存在,创建新文件进行写入

注意:默认为文本模式,其他模式:rb rb+ wb wb+ ab ab+ 加b的作用,以二进制的格式打开文件,进行上述操作如果要以二进制模式打开,加上 b 。

2、file 对象

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

操作方法
读取指定大小的内容f.read()
读取一行的内容f.readline()
读取多行内容f.readlines()
写入内容f.write(data)
写入多行(需要自己加换行符)f.writelines(lines)
立即刷新缓冲(相当于文件保存)f.flush()
获得游标位置f.tell()
调整游标位置f.seek(position)

Python 文件 flush() 方法是用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。
一般情况下,文件关闭后会自动刷新到硬盘中,但有时你需要在关闭前刷新到硬盘中,这时就可以使用 flush() 方法。

实例:

f = open(r'it.txt', 'w+')  # 先清空在写
print(f.read())
f.close()

f = open(r'it.txt','w+')
print(f.write('hello world'))#  11
print(f.write('hello world\n'))# 12
print(f.write('hello world'))# 11

print(f.tell())  # 指针所在的位置
print(f.seek(0)) #两个参数 一个是偏移量
f.close()

执行结果:

11
12
11
35
0

注意:在Windows系统中 一行结束的标志是\r\n 它会把\n转化成\r\n

3、with open…as…(上下文件管理器)

一旦跳出这个语句块 ,就自动就帮你关掉了 ,这就是上下文管理器,with能够自动关闭文件,不需要执行close方法

**实例 **
(我这里就不一一运行了)

实例1
with open('it.txt','w+') as f:
    print(f.write('hello world\n'))
    print(f.write('hello world\n'))
    f.flush()
    print(f.tell())
    f.seek(0,0)
    print(f.read())

实例2
with open('it.txt','r+') as f:   # 多行读取
    print(f.readlines()[2])   # 可以切片

实例3
with open('it.txt','w+') as f:   # 多行写入
    f.writelines(['hello\n','world'])  #怎么读出来 就怎么写进去
    f.seek(0)     #读写都会导致指针的移动
    print(f.read())
    
实例4
#如果使用二进制写入  能否不用二进制读取?
with open('it.txt','wb+') as f:
    f.write('我们永远记得你'.encode())
    f.seek(0)
    a =f.read()
    print(a)  #   print(a.decode())
 
实例5   
#图片操作
with open(r"D:\test\03.jpg",'rb+') as f:  #第一个r作用:反转义
    a = f.read()
    with open(r"test3.jpg",'wb+') as f1:
        f1.write(a)

实例6
# 一个with能不能打开多个文件?
with open(r'it.txt','w+') as f,\
        open(r'it.txt','a+') as f1:
        f.writelines(['hello\n','world'])
        f.seek(0)
        f1.seek(0)
        print(f1.read())
        print(f.read())

实例7    
with open(r'it.txt','r') as f1:
    with open(r'test2.txt','w') as f2:
        a = f1.read()
        print(a)
        f2.write(a)

总结:上下文管理器 不单单在文件里面有运用,在其他的地方也用的非常平凡,文件的操作在爬虫上用的非常之多

二、认识异常(重点)

在了解异常之前我们应该了解异常是什么?
异常的本身是类的实例。

学习异常目的:异常的掌握是程序员的基本要求,以后所有的bug 都可以通过异常的学习 开始自己排查错误

PEP8

1 缩进与换行 每级缩进使用四个空格
2 限制每行的最大长度为79个字符
3 空行
  顶层函数和类之间使用两个空行
  类的方法之间用一个空行
  在函数中使用空行表示不同逻辑段落
4 导入位于文件的顶部
5 避免多余空格
6 注释
  注释要保持与时俱进 一句后面两个空格 跟注释
7 命名规范
  除了正常的命名规范外
  不要使用 大小写的L 大写的O 作为变量名
  类名首字母大写 内部类 加上前导下划线
  函数名应该小写 增强可读性可以使用下划线分割
8 其他
  别用 ‘==‘ 进行布尔值 和 True 或者 False 的比较 应该用 is

1、异常基础

在 Python 中所有的异常都是继承自 BaseException
直接分为四大类:
SystemExit:Python退出异常
KeyboardInterrupt: 键盘打断(Ctrl+C)
GeneratorExit: 生成器退出
Exception: 普通异常(只会使用这部分的异常)

除此之外还有一些我们常见的异常:
NameError 变量名错误
TypeError 类型错误
SyntaxError 语法错误

2、异常处理

2.2.1、try/except

异常捕捉可以使用 try/except 语句
在这里插入图片描述
举个简单的例子:

try:
    print('---1--')
    print(a)# 没有定义
    print('----3---')
except:    #补救措施
    print('补救措施')

执行结果:
---1--
补救措施
#这里a没有定义,所以print(‘--3--’)不会执行,由于用了try/except这里不会报错

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如

except (RuntimeError, TypeError, NameError):
    pass

当然except也可以每次处理一个异常,就像if··elif那样,例如:

# 捕获具体的异常
try:
    a
    # 1/0
    # print(‘nihao’) # 语法错误捕获不到
except NameError:# 只能捕获具体异常   漏写的会打印出来
    print('类型错误1')
except ZeroDivisionError:
    print('分母不能为0')
except Exception:# 代码里边异常的一个基类  未知异常,代码有错就执行
    print('未知错误2')

执行结果:  
类型错误1
#a未定义属于NameError类型错误,所以只执行打印类型错误1

2.2.2、try/except…else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

在这里插入图片描述下面举个简单的例子:

try:
    f = open('it.txt', 'r')
except IOError:
    print('cannot open', 'it.txt')
else:
    print('it.txt', 'has', len(f.readlines()), 'lines')
    f.close()

执行结果:
it.txt has 1 lines

2.2.3、try-finally 语句

ry-finally 语句无论是否发生异常都将执行最后的代码。
在这里插入图片描述
以下实例中 finally 语句无论异常是否发生都会执行:

try:
    runoob()
except NameError as error:
    print('声明错误:%s'%error)
else:
    print('try执行成功!')
finally:
    print('这句话,无论异常是否发生都会执行。')

执行结果:
声明错误:name 'runoob' is not defined
这句话,无论异常是否发生都会执行。

总结:异常的处理对于我们后续的逻辑有很大的帮助,在项目中不会应为个人原因或者网络原因导致系统的直接崩溃,而是利用对应的错误处理返回对应的提示信息,提升产品的体验度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值