当前位置: 首页 > news >正文

StringIO BytesIO

上一篇中我们介绍了文件的基本读写操作,但是很多时候数据的读写并不一定都是在文件中,我们也可以在内存中读写数据,因此引出我们今天的主要内容,即 StringIO 和 BytesIO,让你学会在内存中进行数据的基本读写操作。

1 前言-内存与硬盘

在正式介绍 StringIO 和 BytesIO 之前,我们先来了解一下内存和硬盘的差异,以便更好的理解硬盘中文件的基本操作与 StringIO 和 BytesIO 对数据的基本操作两者之间存在的意义。

内存与硬盘的差异:

差异点内存硬盘
形状长条形,所以有内存条之称四四方方的,内含盘片
容量(以 PC 机为例)4G1T
功能存储任务管理器的进程存储文档、软件等数据
运行速度
特点存放 CPU 运算的数据,一旦断电数据就会消失可以永久存储数据

通俗点来讲,我们电脑里的 C 盘、D盘等都是硬盘,电脑关机后再次开机这些盘符里面的数据依然还在。但是我们电脑任务管理器里面跑的进程的数据都是存储在内存中的,电脑关机后进程里面的数据就不复存在了。

正是由于硬盘的读取数据比较慢,CPU 如果在运行程序的时候所有数据都直接从硬盘中读写,那么电脑的运行速度将会大打折扣。因此 CPU 会将运行软件时要用到的数据一次性从硬盘中调到运行速度很快的内存中,然后 CPU 再与内存进行数据交换。一个很明显的现象就是我们在打开一个软件时会有一段时间延迟,但是打开之后软件的运行速度就很快了。

好了,现在我们应该对在内存与硬盘上读取数据大概有一个了解,开始进入我们的正题。

2 StringIO 和 BytesIO

StringIO 和 BytesIO 的作用简单来说,就是在内存中虚拟一个文件的感觉,这个虚拟出来的文件操作方式与上一篇介绍的在硬盘中文件的基本操作类似。在 Python3 中,这两“兄弟”现在已经归入 IO 模块。

2.1 StringIO

要把 str 字符串写入内存中,我们需要创建一个 StringIO 对象,然后像文件一样对读取内容。其中 StringIO 中多了一个 getvalue() 方法,目的是用于获取写入后的 str。

示例 1:

# 定义一个 StringIO 对象,写入并读取其在内存中的内容from io import StringIOf = StringIO()f.write('Python-100')str = f.getvalue()print('写入内存中的字符串为:%s' %str)f.write('\n') # 追加写入内容f.write('坚持100天')str = f.getvalue()  # getvalue() 可以读取到 StringIO 中的所有内容print('写入内存中的字符串为:\n%s' %str)f.close() # 释放内存中的数据,后续不可再对该 StringIO 进行内容的读写操作# 输出结果# 写入内存中的字符串为:# Python-100# 写入内存中的字符串为:# Python-100# 坚持100天

示例 2:​​​​​​​

# 当然也可以用 read()、readline() 等来读取 StringIO 中写入的字符串from io import StringIOstr = 'Python-100' + '\n' + '坚持100天'f = StringIO(str)currentStr = f.read()print('写入内存中的字符串为:\n%s' %currentStr)f.close()

示例 3:​​​​​​​

# 考虑一个场景,比如你需要对爬虫爬取到的数据进行操作,但是你不想把数据写入本地的硬盘上,这时候 StringIO 就派上用场了。from io import StringIO# 假设的爬虫数据输出函数 outputData()def outputData():    dataOne   = '我是 1 号爬虫数据\n'    dataTwo   = '我是 2 号爬虫数据\n'    dataThree = '我是 3 号爬虫数据'    data = dataOne + dataTwo + dataThree    return data# dataStr 为爬虫数据字符串dataStr = outputData()# 1. 将 outputData() 函数返回的内容写入内存中dataIO = StringIO(dataStr)# 1.1 输出 StringIO 在内存中写入的数据print('1.1内存中写入的数据为:\n%s' %dataIO.getvalue())# 输出结果:# 1.1内存中写入的数据为:# 我是 1 号爬虫数据# 我是 2 号爬虫数据# 我是 3 号爬虫数据# 1.2 按行输出写入的数据方式一print('1.2按行输出写入的数据方式一:')for data in dataIO.readlines():    print(data.strip('\n')) # 去掉每行数据末尾的换行符# 输出结果:# 1.2按行输出写入的数据方式一:# 我是 1 号爬虫数据# 我是 2 号爬虫数据# 我是 3 号爬虫数据# 1.3 按行输出写入的数据方式二# 由于上一步的操作,此时文件指针指向数据末尾(32),我们需要将指针指向起始位置print('由于上一步操作的输出,此时文件指针位置为:%d' %dataIO.tell())# 将文件指针指向起始位置,方便下面的演示dataIO.seek(0)print('1.3按行输出写入的数据方式二:')for data in dataIO:    print(data.strip('\n'))# 输出结果:# 1.3按行输出写入的数据方式二:# 我是 1 号爬虫数据# 我是 2 号爬虫数据# 我是 3 号爬虫数据# 2. 采用 write() 的方法将字符串写入内存dataWriteIO = StringIO()dataWriteIO.write(dataStr)# 2.1 输出内存中写入的数据print('2.1内存中写入的数据为:\n%s' %dataIO.getvalue())# 输出结果:# 2.1内存中写入的数据为:# 我是 1 号爬虫数据# 我是 2 号爬虫数据# 我是 3 号爬虫数据 # 2.2 按行输出写入的数据方式一# 由于 write() 写入字符串后,文件指针会指向写入内容的结尾,需要将文件指针指向起始位置,否则未能输出内容print('2.2按行输出写入的数据方式一:')print('输出内容为空!')for data in dataIO:    print(data.strip('\n'))print('输出内容为空!')# 输出结果:# 2.2按行输出写入的数据方式一:# 输出内容为空!# 输出内容为空!# 2.3 按行输出写入的数据方式二# 将指针指向起始位置重新按行输出dataIO.seek(0)print('2.3按行输出写入的数据方式:')for data in dataIO.readlines():    print(data.strip('\n'))# 输出结果# 2.3按行输出写入的数据方式:# 我是 1 号爬虫数据# 我是 2 号爬虫数据# 我是 3 号爬虫数据

Tips: 根据这个例子可以看出,当我们使用 StringIO(str) 方法向内存写入数据时,文件指针是指向起始位置的,比如示例 3 的 1.2 场景中 readlines() 可以读取到数据。当我们使用 write(str) 方法向内存写入数据时,文件指针会指向写入内容的结尾,读取数据时需要将指针移动到起始位置,比如示例 3 的 2.3 场景。

2.2 BytesIO

BytesIO,顾名思义,就是将字节流写入到内存中,其实它的操作方法与 StringIO 一样,区别就在于前者写入字节,后者写入字符串。这边就简单举个例子演示,不再具体介绍了。

示例:​​​​​​​

# 定义一个 BytesIO 对象,写入并读取其在内存中的内容from io import BytesIOstr = 'Python-100' + '\n' + '坚持100天'f = BytesIO(str.encode('utf-8'))print('写入内存的字节为:%s' %f.getvalue())print('字节解码后内容为:\n%s' %f.getvalue().decode('utf-8'))

Tips: 根据示例可知,对于字节我们需要掌握其正确的编解码方式,比如有 'utf-8'、'gbk' 等。

3 总结

本节给大家介绍了 Python 中 StringIO 和 BytesIO 的基本使用方法,掌握在内存中存取数据的基本操作,同时介绍了内存与硬盘的区别,让大家明白在内存中存取数据的优势,助力您在爬虫的道路越走越远。

相关文章:

StringIO BytesIO

上一篇中我们介绍了文件的基本读写操作,但是很多时候数据的读写并不一定都是在文件中,我们也可以在内存中读写数据,因此引出我们今天的主要内容,即 StringIO 和 BytesIO,让你学会在内存中进行数据的基本读写操作。 1 …...

通讯录管理系统(个人学习笔记黑马学习)

1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信…...

[SpringBoot3]远程访问@HttpExchange

六、远程访问HttpExchange[SpringBoot3] 远程访问是开发的常用技术,一个应用能够访问其他应用的功能。SpringBoot提供了多种远程访问的技术。基于HTTP协议的远程访问是最广泛的。SpringBoot中定义接口提供HTTP服务。生成的代理对象实现此接口,代理对象实…...

Linux安装ntp并使用阿里云配置ntp服务器

安装 NTP 客户端: 打开终端,以 root 权限执行以下命令来安装 NTP 客户端: sudo zypper install ntp 编辑 NTP 配置文件: 使用文本编辑器打开 NTP 的配置文件 /etc/ntp.conf,例如使用 nano 编辑器: sudo v…...

js常用方法总结

1、slice 和 splice slice表示截取,slice(start,end),不改变原数组,返回新数组。 splice表示删除,splice(start,length,item),会改变原数组,从某个位置开始删除多个元素,并可以插入新的元素。…...

在PHP中安装Composer并管理Vue前端依赖包

系列文章目录 文章目录 系列文章目录前言一、安装Composer二、使用Composer管理PHP依赖包三、使用npm管理Vue前端依赖包总结 前言 在开发Web应用程序时,使用Composer来管理PHP的依赖包和Vue前端的依赖包是一种很常见的做法。Composer是PHP的包管理工具,…...

03-前端基础CSS-第一天

01-CSS层叠样式表导读 目标: 能够说出什么是CSS能够使用CSS基础选择器能够设置字体样式能够设置文本样式能够说出CSS的三种引入方式能够使用Chrome调试工具调试样式 目录: 1.CSS简介2.CSS基础选择器3.CSS字体属性4.CSS文本属性5.CSS引入方式6.综合案…...

多张图片转为pdf怎么弄?

多张图片转为pdf怎么弄?在网络传输过程中,为了避免图片格式文件出现差错,并确保图片的清晰度和色彩不因不同设备而有所改变,常见的做法是将图片转换为PDF格式。然而,当涉及到多张图片时,逐一转换将会变得相…...

jdk新版本特性

JDK8,JDK11,JDK17,JDK21及中间版本主要更新特性_jdk重要版本_ycsdn10的博客-CSDN博客 Java 20 新特性概览 | JavaGuide(Java面试 学习指南)...

进程Start

Linux中的命令解释器和Windows的程序管理器explorer.exe一样地位,都是在用户态下运行的进程 共享变量发生不同进程间的指令交错,就可能会数据出错 进程只作为除CPU之外系统资源的分配单位 CPU的分配单位是线程 每个进程都有自己的独立用户空间 内核空间是OS内核的…...

SpringCloud学习笔记(六)_Ribbon服务调用

Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说,就是…...

系统架构设计师考试论文:论无服务器架构及其应用

近年来,随着信息技术的迅猛发展和应用需求的快速更迭,传统的多层企业应用系统架构面临越来越多的挑战,已经难以适应这种变化。在这一背景下,无服务器架构(ServliessArchitecture)逐渐流行,它强调业务逻辑由事件触发&am…...

linux下安装Mycat

1 官网下载mycat 官方网站: 上海云业网络科技有限公司http://www.mycat.org.cn/ github地址: MyCATApache GitHubMyCATApache has 34 repositories available. Follow their code on GitHub.https://github.com/MyCATApache 2 Mycat安装 1 把MyCat…...

OpenCV(八):图像二值化

目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的…...

《Flink学习笔记》——第十一章 Flink Table API和 Flink SQL

Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认为它们是一体的。Flink是批流统一的处理框架,无论是批处理(DataSet API&a…...

电脑提示缺少d3dx9_43.dll的问题及5个解决方法

大家好!今天,我将和大家分享一个电脑提示缺少d3dx9_43.dll的问题及其解决方法。这个问题可能会影响到我们在使用电脑时的一些功能,所以掌握这个解决方法对我们来说是非常有帮助的。 首先,我们来了解一下什么是d3dx9_43.dll。d3dx9…...

Linux stat 命令及示例

介绍 该stat命令打印有关文件和文件系统的详细信息。该工具提供有关所有者是谁、修改日期、访问权限、大小、类型等信息。 该实用程序对于故障排除、在更改文件之前获取有关文件的信息以及例行文件和系统管理任务至关重要。 本文stat通过实际示例解释了有关 Linux 命令的所有…...

06-基础例程6

基础例程6 01、WIFI实验—WebServer 实验介绍 ​ 连接路由器上网是我们每天都做的事情,日常生活中只需要知道路由器的账号和密码,就可以使用手机或电脑连接到路由器,然后上网。 ​ 连接路由器,将ESP32的IP地址等信息通过shell…...

【附安装包】Eplan2022安装教程

软件下载 软件:Eplan版本:2022语言:简体中文大小:1.52G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu.co…...

大数据-玩转数据-Flink窗口

一、Flink 窗口 理解 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

小木的算法日记-多叉树的递归/层序遍历

🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...