python中StringIO和BytesIO
创始人
2024-04-11 04:29:40
0

1. 类文件对象

最常见的io操作是将磁盘中的文件读到内存以及内存内容写入文I件。还有一种内存和内存之间的IO,叫类文件对象,python中的StringIOBytesIO就是类文件对象,通俗解释即:像操作文件一样在内存中操作字符串和二进制内容
磁盘上的文件,就是将数据持久化到磁盘的一块区域,供后面重复使用。其优点就是持久化稳定不丢失,但是缺点也很明显,就是每次要使用都要从磁盘读入,相对内存而言很缓慢。如果只是短时间的重复利用,并不希望长期持久化,而且对速度的要求比较高,这时候就可以考虑缓存。

2. StringIO

这种类文件对象是用来存储字符串的,下面展示了如何使用

from io import StringIO, BytesIOif __name__ == "__main__":# 初始化并写入内容# io_obj = StringIO("i love china")# 初始化ioio_obj = StringIO()# 写入内容io_obj.write("i love china")# 读取io中内容content = io_obj.read()# 返回:空print(content)

如上打印结果为空,这是因为内存中的对象有一个标志位的概念,往里面写入,标志位后移到下一个空白处。而读数据的时候是从标志位开始读,所以想要读取前面的数据需要手动将标志位进行移动。
如下,通过seek方法将标志位移动到到首位,再读取内容就会读出所有内容;将seek中的0换成2会发现会舍弃前面两个字符。

    io_obj = StringIO()# 写入内容io_obj.write("i love china")# 将标志位移动到首位io_obj.seek(0)# 读取io中内容content = io_obj.read()# 返回:i love chinaprint(content)

通过getvalue()方法获取全部内容,该方法不受标志位影响。注意,当我们在初始化io时同时写入内容io_obj = StringIO("i love china"),此时读取内容也不受标志位影响

    io_obj = StringIO()# 写入内容io_obj.write("i love china")# 读取io中内容content = io_obj.getvalue()# 返回:i love chinaprint(content)

readline()方法读取以\n为界的一行数据,readlines()读取所有行,注意标志位置零

	io_obj = StringIO()# 写入内容io_obj.write("i love china\n wo ai zhongguo")# 读取io中内容io_obj.seek(0)# content = io_obj.readline()# 返回:i love china# print(content)content_all = io_obj.readlines()# 返回所有行:['i love china\n', ' wo ai zhongguo']print(content_all)

该对象使用完毕直接关掉,该内存里的内容被清空

io_obj.close()

3. BytesIO

StringIO只能存储字符串,对于图片视频等Bytes类型的内容就需要用到专门存储Bytes类型的BytesIO对象,用法完全相同,即:write()写内容,read()读内容,getvalue()获取所有内容…

	# 初始化ioio_obj = BytesIO()io_obj.write("i love china".encode("utf-8"))io_obj.seek(0)content = io_obj.read()# 返回:b'i love china'print(content)

4.应用

下面展示直接从网络读取一张图片,而不需要将图片保存到本地,再读本地文件

    import requestsfrom PIL import Imageresponse = requests.get('https://ts1.cn.mm.bing.net/th/id/R-C.fd4056c8c00979ab8561f8db8219c2ae?rik=JPk67EIYaKIS3A&riu=http%3a%2f%2fimg.mm4000.com%2ffile%2fa%2fa2%2f869bd2bd6a.jpg&ehk=2z%2bPuRHJOYtkm9ICs8fPs0EJbE96jJX2E8QyrVP5kyQ%3d&risl=&pid=ImgRaw&r=0')img = BytesIO()img.write(response.content)pict = Image.open()pict.show()img.close()

返回结果
在这里插入图片描述
注意:此处我们无法直接把下载的Bytes类型用Image打开,Image接受的参数是一个文件对象,或者类文件对象。所以要么是磁盘上的文件,要么是内存中的BytesIO

相关内容

热门资讯

2026年“两新”“两重”政策... 2026年“两新”(大规模设备更新和消费品以旧换新)政策有哪些新变化?当前,“两重”建设(国家重大战...
2026年四川汽车、家电、数码... 12月31日,四川省商务厅发布了《四川省商务厅关于2026年四川省汽车以旧换新补贴的公告》《四川省商...
仁盈律所代理投资者诉世纪星源(... 2025年10月,上海仁盈律师事务所张晏维律师团队在证券维权领域再立新功,代理的“投资者诉世纪星源(...
国务院常务会议解读|国务院部署... 新华社北京12月31日电(记者谢希瑶)12月31日召开的国务院常务会议指出,跨境贸易便利化是营造一流...
证监会发布!事关行政执法当事人... 12月31日,证监会发布《关于修改<证券期货行政执法当事人承诺制度实施规定>的决定》(以下简称《决定...
政策带旺消费,广州线下落地20... 2026年1月1日,随着新年钟声敲响,广东新年消费品以旧换新活动(即“国补”活动)正式启动。零点刚过...
日照市2026年基本医疗保险政... 日照市职工2026年基本医疗保险政策汇总一览表(暂行) 日照市居民2026年基本医疗保险政策汇总一...
“芙蓉花红”映民心 恒达社区答... 长沙晚报掌上长沙12月31日讯(通讯员 刘梦莹)12月30日,芙蓉区荷花园街道恒达社区开展“芙蓉花红...
*ST熊猫(600599)披露... 截至2025年12月31日收盘,*ST熊猫(600599)报收于9.93元,较前一交易日下跌4.98...
陆家嘴(600663)披露公司... 截至2025年12月31日收盘,陆家嘴(600663)报收于7.91元,较前一交易日上涨0.38%,...