python的IO流操作和异常处理

IO流

1、什么是IO流?
I(input) O(output)Stream
主要说的就是将数据读入内存或者内存输出的过程中使用的技术
常见的IO流操作,一般说的是【内存】与【磁盘】之间的输入输出。
2、作用
持久化数据,保证数据不再丢失!
3、IO流的分类
根据数据流动:
r — 输入流
w — 输出流
根据数据类型
b ---- 字节流
t ---- 字符流
4、IO流操作
使用全局函数open打开一个IO操作
open函数主要是用来操作打开一个本地文件
open参数:
【file】:表示一个文件的具体路径,或者要打开的文件名称
【mode】 : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。
【buffering】 : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
【encoding】: 一般使用utf8
mode类型:
“r”——read表示输入流

“w”——write表示输出流

“t"——表示字符流 #使用字符操作IO流

“b”——表示字节流 #使用字节操作IO流 (字节流操作大数据的,不建议一次性读取)

“a”——表示追加输出
5、IO流的使用
例:

# 创建一个输出流
f = open('text.txt','w')
# 将66666写入创建的text.txt文件内
f.write("66666")
# 关闭流 如果不关会造成资源浪费
f.close()

在这里插入图片描述
在当前目录下创建一个text.txt文件,也可以填入绝对路径

# 创建一个输入流
f = open('text.txt','r')
# 读取文件中第一行的内容,返回字符串
print(f.readline())
# 关闭流
f.close()

f = open('text.txt','r')
# 读取文件内所有内容,返回字符串
print(f.read())
f.close()

f = open('text.txt','r')
# 根据行读取,返回的是列表
print(f.readlines())
f.close()

在这里插入图片描述
拷贝数据,使用IO流将text.txt文件内内容拷贝到test.py文件内

def copyFile(src, dest):
    """文件的拷贝"""
    src_file = open(src, "br")
    dest_file = open(dest, "bw")
    # 当文件时,如果文件是字节文件,要注意大文件的拷贝
    # 如果是大文件,一定不要直接拷贝,防止内存溢出
    while True:
        content = src_file.read(1024)  # 读取文件中1024字节
        if content == b'':  # 对判断是否读完
            print("文件读取完成")
            break
        else:
            dest_file.write(content)  # 将读出的内容写入另一个文件
    src_file.close()
    dest_file.close()
if __name__ == '__main__':
    src = input("请输入您要拷贝的文件路径:")
    dest = input("请输入你要保存的新路径:")
    copyFile(src, dest)

在这里插入图片描述
6、IO流读取与写入步骤
IO读取文件的步骤:
建立待读取的文件(读取文件,文件必须是存在的)
打开文件
读取文件
输出读取的内容
关闭资源

IO写入文件的步骤:
建立待写入的文件(文件不一定存在)
获取文件的父级目录
判断父级目录是否存在
父级目录不存在,要创建父级目录
打开文件
建立写入的内容
写入内容
关闭资源

捕获异常与异常处理

1.导致程序在运行过程中出现非正常终端和退出的错误,称为异常。大多数的异常都不会被程序处理,而是以错误的形式展现出来。

2.异常有很多类型,Python 内置了几十种常见的异常,无需特别导入,直接就可以用。所有异常都是异常类,首字母是大写的。

1、常见的python异常

AttributeError:试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

IOError :输入/输出异常;基本上是无法打开文件

ImportError :无法引入模块或包;基本上是路径问题或名称错误

IndentationError:语法错误(的子类) ;代码没有正确对齐

IndexError:下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError:试图访问字典里不存在的键

KeyboardInterrupt:Ctrl+C被按下

NameError:使用一个还未被赋予对象的变量

SyntaxError Python:代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError:传入对象类型与要求的不符合

UnboundLocalError:试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError:传入一个调用者不期望的值,即使值的类型是正确的

2、异常捕获
当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try…except…结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有:

try/except:捕获异常并处理

pass:忽略异常

as:定义异常实例(except MyError as e)

else:如果try中的语句没有引发异常,则执行else中的语句

finally:无论是否出现异常,都执行的代码

raise:抛出/引发异常
例:

try:
     <语句>
 
except Exception as e:
 
      print('异常说明')

在这里插入图片描述

  • 可能产生的错误放在try 中
  • 产生错误后要做的处理放在except中

捕获多个异常:

try:
     <语句>
 
except (<异常名1>, <异常名2>, ...):
 
      print('异常说明')

在这里插入图片描述
没有执行else后和try后的输出语句,而是执行了except后的代码,证明这是一个异常
区分优先级:

try:
     <语句>
 
except <异常名1>:
 
      print('异常说明1')
 
except <异常名2>:
 
      print('异常说明2')
 
except <异常名3>:
 
      print('异常说明3')

该种异常处理语法的规则是:

执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

异常中的else

try:
     <语句>
 
except <异常名1>:
 
      print('异常说明1')
 
except <异常名2>:
 
      print('异常说明2')
 
else:
 
      <语句>  # try语句中没有异常则执行此段代码

在这里插入图片描述


版权声明:本文为Sk_Ya原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。