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语句中没有异常则执行此段代码
