一、什么是io?
IO – (input、output)指的是输入输出流
电脑使用cpu进行大量的运算,内存用来储存变量、运算以及各种操作。
内存RAM是一个瞬时设备,内存只要断电,数据将丢失。
所以我们需要一个持久化设备ROM (硬盘)保证断电的情况下也能存储数据
IO操作就是将内存中的瞬时数据持久化到磁盘上
二、iO的字符流操作(字符串、文档)
IO操作就是将内存中的瞬时数据持久化到磁盘上
所以我们这里说的输入-跟输出指的是对内存而言
一般一个完整的IO操作:
打开文件 --> 读取数据 —> 数据运算–> 数据的持久化(输出) --> 关闭资源
读取数据是将数据从一个持久化设备中读取到内存中
输出数据是将数据从内存中保存到磁盘上
python的io操作要用到 open( ) 函数
open函数的几个参数
从第三个参数开始就不用按照顺序去写,直接使用命名参数写下后面就行。
file 指定要打开的文件路径
mode= ‘r’ 模式默认为 rt 读文本文档,读字节的话修为 rb
如果写入文件必须改为w,如果没有该文件会自动创建
x,表示创建,如果已经存在,x就不会再创建,会报错
buffering=-1 读取到哪个位置,默认为 -1表示全部读完。可以指定读到第几行结束
encoding=None 编码格式
errors=None 错误参数,python 3 里没用
newline=None 换行参数
closefd=True
opener=None
1、输出操作(读取)
对内存而言是输出,对我们而言是读取
# 调用open函数打开一个文件
# open函数打开当前工作空间下的a.txt文件
# 第二个参数表示打开文件的模式
# 默认不写,则是r,表示读取文件
# 默认读取的数据是文本文档
# 如果打开的文本档是中文需要将编码格式转换一下
f = open("a.txt", "r",encoding = "utf-8")
# 调用read方法
msg = f.read()
print(msg)
# 调用close关闭io操作
f.close()
运行后
2、输入操作(写入)
对内存而言是输入,对我而言是写入。
msg = "每临绝境峰回路又转"
# 注意:如果向磁盘上写入数据,一定将mode设置为w
# 表示写入数据,输出数据
f = open("a.txt", "wt")
# 将数据写入到f对象住
f.write(msg)
# 关闭资源
f.close()
写入到文档末尾
msg = "在一个狂风大作的晚上,出现一个现象,什么现象呢?我不告诉你\n"
# mode=a,a append,表示在文档末尾再追加数据
# 不会覆盖原有数据
# 如果是mode='x',表示该文件必须在不存在的情况下,第一次打开,就会创建文件
f = open("a.txt", "w")
# 将数据写入到f对象住
f.write(msg)
# 关闭资源
f.close()
三、io字节操作()
1、读取字节文件到内存中
从持久性设备读到内存
# mode t 表示text open默认处理的文本文档
# 当我们想处理字节数据的,就需要
# 将t修改b binary 二进制
# open(file, mode="wt")
# 读取图片
f = open("a.png", mode="rb")
picture = f.read()
# 将该图片保存到另外一个地方去
ff = open("b.png", "wb")
ff.write(picture)
f.close()
ff.close()
2、文件备份
def copy_file(src, dest):
fr = open(src, "rb")
fw = open(dest, "ab")
while True:
# 一个10M为单位读取数据,防止读取过多,导致内存不够用,电脑蓝屏
# fr.read() # 不要这样读取数据
content = fr.read(10 * 1024 * 1024)
if content != b'':
# 直接将数据读取到内存
fw.write(content)
else:
break
fr.close()
fw.close()
x = input("请输入需要拷贝文件路径:")
y = input("请输入备份路径:")
copy_file(x, y)
四、with语句块
在IO操作的时候,发现IO一旦打开,必须关闭
关闭操作又很容易被程序员忘记!!
python为大家提供with
在python如果使用with 打开IO,则with结束时
自动调用io的close
以后Python的IO,推荐使用with !!!!
# 使用with打开IO,等with结束时,该IO流会自动调用close,关闭IO
with open("a.txt", "r") as f:
print(f.read())
print("with语句块结束了……")
五、对象序列化与反序列化
当我们想要把一个对象给存到磁盘中的时候,需要把该对象序列化才能存储
pickle 模块里的四个方法:
pickle.dumps( ) # 把对象序列化成字节(二进制)数据
把ls存到内存,把ls对象从内存输入到磁盘
#pickle模块实现了用于序列化和
#反序列化Python对象结构的二进制协议
import pickle
#列表是一个对象,对象概念是一个逻辑单位
ls = [1,2,3,4,5,6]
#如果我们想存对象,就需要序列化
dumps = pickle.dumps(ls)
with open("C:\\Users\\hellen\\Desktop\\新建文件夹\\a.dat","bw") as f:
f.write(dumps)
读ls,也就是从磁盘输出到内存
pickle.loads 显示被序列化后的对象
dump 是直接将对象存到内存与dumps不同
dumps是把对象序列化成字节数据
import pickle
ls = [1,2,3,4,5]
f = open("d:\\a.dat","wb")
pickle.dump(ls,f)
f.close()
pickle.load(file)
注释:
反序列化对象,将文件中的数据解析为一个python对象。