python中的IO流使用解读
作者:Awen0201
什么是IO流
input output stream , 主要指的是计算机输入和输出的操作;
一般来说是内存与磁盘之间的输入输 出(侠义);
IO流操作是一种持久化操作,是将数据持久化在磁盘上。
Python中操作IO流的方法
通过open全局函数( 主要作用是打开本地的文件)
open函数解析:第一个参数:file (打开的文件的文件名或者路径)
第二个参数: mode 打开的模式( 默认的是字符输入流(r) )
r
:read表示输入流w
:write表示输出流t
:表示字符流b
:表示字节流a
:表示追加输出
注意:一定要关流:f.close()
IO流的分类
1、根据数据流动方向分类
(1)输入流:相对于内存而言,例如从磁盘、投影仪、网络中读取数据。
>>> f = open("aa.txt","r") >>> f <_io.TextIOWrapper name='aa.txt' mode='r' encoding='cp936'> >>> f.read() '我爱学习,学习使我快乐!' >>> f.close()
上面的代码:mode = "r" 表示输入流,读取当前路径下名为aa.txt的文档的内容
(2)输出流:相对于内存而言,例如向磁盘、投影仪、网络等显示设备中写入数据。
>>> f = open("aa.txt",mode="w") >>> f <_io.TextIOWrapper name='aa.txt' mode='w' encoding='cp936'> >>> f.write("阿文今天很开心!OVO") 11 >>> f.close()
上面的代码:mode = "w" 表示输出流,将内容保存在aa.txt的文档之中,并且会覆盖之前的内容;f.write("")之后返回的是写入字符的个数。
注意每次结束操作之后都要关流:f.close(),这样才能写入需要写入的东西;也有不关流写入内容的方法:f.flush()。
2、根据数据类型分类
字节流:mode = “b” 表示使用字节来操作IO流(如视图、音频、图片可执行文件等);字节流操作较大数据时,不建议一次性读取。
#读取图片视频或者音频等 def copy_file(src,dest): f = open(src,"rb") f1 = open(dest,"wb") f1.write(f.read()) f.close() f1.close() if __name__ == '__main__': copy_file("D:\\PYcharm\\哈哈\\1.jpg","C:\\Users\\QWQ\\Desktop\\1.jpg")
上面的代码:f是输入流,f1是输出流,将f读取的字节流数据写入f1中,实现了将图片1.jpg复制到桌面上的操作。
字符流:mode = “t” 表示使用字符操作IO流
#读取文档数据 def io_test(url1,url2): f1 = open(url1,"rt",encoding='UTF-8') f2 = open(url2,"wt",encoding='UTF-8') msg = f1.read() f2.write(msg) f1.close() f2.close() io_test("C:\\Users\\QWQ\\Desktop\\第一天\\a.txt","C:\\Users\\QWQ\\Desktop\\第一天\\b.txt")
上面的代码:将文档a.txt的字符流内容写入文档b.txt之中。
注意的编码格式,如果编码格式不一致,会报错或者乱码,处理数据时转码:encoding='UTF-8'。
注意:
(1)本质 Mode = "r" "w" ------“rt" "wt" --------- t text 字符流; b ------- binary mode, mode = "b" ------- 操作字节数据(图片、音频、视频等)。
(2)字节可以操作任何数据,字符只能操作字符数据。
(3)IO流一定要及时关闭,避免资源的占用以及避免出现异常。
(3)拷贝数据时,为了避免因为目标文件过大而导致电脑死机,应使用read参数来控制每次拷贝数据的多少,也可以使用循环来做。
(5)字节流操作大数据的时候,不建议一次性读取;字符流,我们一般不用考虑内存不够用问题(如500W字约10M左右)。
(6) 出现名字相同的文件进行备份的时候,会覆盖掉原本的内容,可使用参数 a:表示追加输出 ;这样需要保存的数据会保存在原来数据的后面。
编写一个程序:将某个文件备份到需要保存的路径
from os import path import uuid def copy_file(): src = input("请输入源文件的路径:") dest = input("请输入你的保存路径:") f = open(src,"rb") filename = src[src.rfind("\\")+1:] random_uuid = uuid.uuid4().hex filename = random_uuid + filename print(filename) f1 = open(path.join(dest,filename),"wb") while True: #以M单位进行读取 data = f.read(1024*1024) #字符流读到最后会返回"" if data == b"": print("数据读取完成") break else: f1.write(data) f.close() f1.close() if __name__ == '__main__': copy_file()
对象序列化
列表、字典、集合和元组都是抽象的概念,需要把对象持久化操作,所以需要序列化;
是把对象这种抽象的概念持久化到磁盘上,换句话说就是将对象转为字节和字符。
pickle(可以将对象转换为字节数据)
dumps
------ 将对象序列化为字节数据loads
------ 将字节数据反序列化为对象dump
------ 将对象序列化为字节数据并且保存到 file 中load
-------- 将 file 字节数据反序列化为对象
json(可以将对象转换为字符数据)
dump
------ 将对象序列化成为字符数据,并且保存到file中dumps
------ 将对象序列化成为字符数据load
------ 将一个file对象反序列化为对象loads
------ 将一个字符串据反序列化为对象
注意:
json这个模块一般用来序列化字典对象,或者转换json数据,但是其他对象也是可以的
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。