python中StringIO和BytesIO

news2024/10/6 22:30:02

1. 类文件对象

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

2. StringIO

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

from io import StringIO, BytesIO

if __name__ == "__main__":
    # 初始化并写入内容
    # io_obj = StringIO("i love china")
    # 初始化io
    io_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 china
    print(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 china
    print(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()获取所有内容…

	# 初始化io
    io_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 requests
    from PIL import Image
    response = 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于FPGA的SD卡的数据读写实现(SD NAND FLASH)

文章目录 1、存储芯片分类 2、NOR Flash 与 NAND Flash的区别 3、什么是SD卡? 4、什么是SD NAND? 5、SD NAND的控制时序 6、FPGA实现SD NAND读写 6.1、设计思路 6.2、仿真结果 6.3、实验结果 1、存储芯片分类 目前市面上的存储芯片&#xff0…

如何使用腾讯云提供的WordPress应用镜像搭建博客网站系统!

之前也有写过搭建WordPress的教程,如何使用轻量应用服务器搭建WordPress个人博客使用的是宝塔面板一件搭建的方式,但是还是有一些麻烦,这里我们之间使用腾讯云提供的WordPress应用镜像搭建,感兴趣小伙伴可以参考以下! …

嵌入式分享合集108

一、PLC串口通讯的基本知识 这几天弄plc都要神经了 尤其西门子的 太烦了 s7200cn s7200smart s1200 编程软件都不一样~~服 , 然后接线也很烦 好了 正题 电气作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口 什么是串口通讯? 串口通讯的使…

阿里强势推出Spring源码进阶宝典:思维脑图+视频教程+笔记文档

这不是准备跳槽了,所以最近摸鱼比较多一些,老大默许了,我觉得我老大还是很好的。也在网上看了一些资料,但是,我发现很多讲解注解的时候,对于一些可以直接点击源码查看的内容讲解的占多数,但是授…

ThreadPoolExecutor 线程池参数详解,执行流程

线程池的使用: public static void main(String[] args) {ThreadFactory sThreadFactory new ThreadFactory() {private final AtomicInteger mCount new AtomicInteger(1);Overridepublic Thread newThread(Runnable r) {int andIncrement mCount.getAndIncrement();return…

成熟的汽车衡称重软件,应具备哪些品质

每台汽车都配电子计算机、打印机各一台,并配相应称重管理软件。制造厂商开发的最新软件应免费及时为买方升级。自动称重系统管理软件选用国内成熟产品,至少在国内有10套以上稳定运行业绩,需配一套容量为2KVA,220V的UPS电源至少满足…

Guava LongMath类

Guava LongMath类 Guava LongMath类 LongMath提供long基础类型的实用方法。 类声明 以下是com.google.common.math.LongMath类的声明: GwtCompatible(emulatedtrue) public final class LongMath extends Object 方法 方法继承 这个类继承了以下类方法&#xf…

二、数据库查询语句(多表查询篇)

二、数据库查询语句(多表查询篇) 1、笛卡尔积 ​ 前面涉及的都是单张表的查询,如果我们的查询条件相对比较复杂,需要涉及多张表进行查询,如果是两张无关的表联合查询,列出所有的可能的结果,如下图: 如果没…

网易云课堂-课程分析

需要原始数据的可以联系我、在评论区留下邮箱 需要原始数据的可以联系我、在评论区留下邮箱 需要原始数据的可以联系我、在评论区留下邮箱 需要原始数据的可以联系我、在评论区留下邮箱 数据展示 一级类目 二级类目 三级类目 求和项:在学人数 平均值项:原始价格 平均值…

docker-compose配合Dockerfile使用

也就是在dockers-compose.yml文件中添加build 指定一下我的Dockerfile文件的路径 例如我的dockers-compose.yml文件在docker-compose文件夹下,而docker-compose文件夹与Dockerfile和项目的war包在同一级目录,也就是Dockerfile文件,在dockers-…

readme.md编写并生成html

目录1、Markdown教程2、生成html3、目录制作3.1 vscode Markdown Preview Enhanced 插件3.2 自定义侧边栏4、参考1、Markdown教程 Markdown 教程 | 菜鸟教程 2、生成html 通过 vscode 下载 Markdown Preview Enhanced、Markdown PDF等插件,就可以实现转化 3、目…

Linux网络管理OSI和TCP/IP

作者简介:一名软件运维工作人员,正在自学云计算课程。宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。创作不易,动动小手给个点…

【改进灰狼优化算法】贪婪的非分层灰狼优化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

RF电路设计常见bug及解决方法

单片射频器件大大方便了一定范围内无线通信领域的应用,采用合适的微控制器和天线并结合此收发器件即可构成完整的无线通信链路。它们可以集成在一块很小的电路板上,应用于无线数字音频、数字视频数据传输系统,无线遥控和遥测系统,…

转自【AI科技评论】专访李海洲教授 | 机器智能对话是毕生所求

一直来到实叻坡,乜事无。上山来做工,伯公“多隆”保平安。——潮州过番歌 所谓“过番”,指早期潮州人外出务工,乘坐小船历经七天七夜到达东南亚谋生,“实叻坡”是马来语“Selat”的音译词,便是指“新加坡”…

Quartz学习

任务执行流程 StdSchedulerFactory创建和属性初始化 如果自定义了属性,会在这里加载 StdScheduler创建 入口为StdSchedulerFactory#getScheduler();,首次进入时调用StdSchedulerFactory#instantiate: 如果没有配置自定义属性,则先…

2022年企业数字化技术应用 5 大趋势丨三叠云

根据易观分析发布的相关报告,本期视频将对2022年企业数字化技术应用 5 大趋势进行讲解,内容可能比较硬核,值得你先收藏再观看。 趋势一:武装数字员工“RPA低代码AI” 中国市场技术供应商正在快速推动技术民主化进程,其…

并发编程(二)有序性

【问题的产生】: 程序真的是按照顺序执行的吗? /*** 本程序跟可见性无关,曾经有同学用单核也发现了这一点*/import java.util.concurrent.CountDownLatch;public class T01_Disorder {private static int x 0, y 0;private static int a …

java小技能:集成开发工具(IDE)

文章目录 I IDEA1.1 下载1.2 试用II 忽略IntelliJ IDEA 文件2.1 .gitignore的例子2.2 从idea进行忽略III idea使用非模式提交界面IV DataGrip4.1安装4.2 Actsee alsoI IDEA 1.1 下载 https://www.jetbrains.com/zh-cn/idea/download/other.html 1.2 试用 IntelliJ IDEA 2021…

快手如何玩转复杂场景下的说话人识别?| ASRU 2021

快手是一个短视频社区,短视频和直播中通常混合各种形式的声音,如语音、音乐、特效音和背景噪声等,这些声音很好的提升了短视频和直播的用户消费体验,但同时也为音频内容理解带来极大的困难和挑战。如何在复杂场景下准确高效的进行…