python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python中的IO流

python中的IO流使用解读

作者:Awen0201

这篇文章主要介绍了python中的IO流使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

什么是IO流 

input output stream , 主要指的是计算机输入和输出的操作;

一般来说是内存与磁盘之间的输入输 出(侠义);

IO流操作是一种持久化操作,是将数据持久化在磁盘上。

Python中操作IO流的方法

通过open全局函数( 主要作用是打开本地的文件)

open函数解析:第一个参数:file  (打开的文件的文件名或者路径)

第二个参数: mode  打开的模式( 默认的是字符输入流(r) )                                                   

注意:一定要关流: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(可以将对象转换为字节数据)

json(可以将对象转换为字符数据)

注意:

json这个模块一般用来序列化字典对象,或者转换json数据,但是其他对象也是可以的

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文