当前位置: 首页 > 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分钟内有多少用户点击…...

【python爬虫】—豆瓣电影Top250

豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片,涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影&#xff…...

【跟小嘉学 Rust 编程】十五、智能指针

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

Python爬虫基础之正则表达式

目录 一、什么是正则表达式? 二、re.compile()编译函数 三、group()获取匹配结果函数 四、常用匹配规则 4.1匹配单个字符 4.2匹配前字符次数 4.3匹配原生字符串 4.4匹配字符串开头和结尾 4.5分组匹配 五、re.match()开头匹配函数 六、re.search()全文搜索…...

【LeetCode】双指针妙解有效三角形的个数

Problem: 611. 有效三角形的个数 文章目录 题目分析讲解算法原理复杂度Code 题目分析 首先我们来分析一下本题的思路 看到题目中给出的示例 题目的意思很简单,就是将给到的数字去做一个组合,然后看看这三条边是否可以构成三角形。那判断的方法不用我说&a…...

mysql 计算两点之间距离

先说一下我们可能会用到的一些场景,这样同学们可以先评估,该篇文章是否对你有帮助! 场景: 假设 美团,我点外卖时,系统会让我先进行定位,比如我定位在了 A 点,系统就会给我推荐&…...

c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码?

c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码? C语言自定义头文件是一种用来封装函数和变量声明的文件,它通常用于将一组相关的函数和变量的声明集中在一个地方&#…...

electron应用打包成功纪念一下

electron应用打包成功纪念一下,以前曾经行过后来打包各种报错,现在有空就尝试解决一下 首先安装nvm能够方便切换node版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash 顺利安装后你用nvm list查看node列表时会…...

远程办公中安全远程访问解决方案

什么是安全远程访问 安全的远程访问是一个至关重要的过程,可让您使用互联网从远处完全控制某人的设备。为了确保安全,为受保护的远程访问采取了额外的身份验证和加密措施。 为什么安全远程访问解决方案很重要 当 IT 技术人员从远处帮助人们解决计算机…...

StartUp启动框架-Android启动性能

简述 当谈论Android应用程序的启动性能时,StartUp启动框架是一个不可忽视的关键工具。它旨在优化应用程序的启动过程,确保用户在打开应用时能够迅速获得流畅、高效的体验。让我们来深入了解StartUp框架的作用和重要性,以及它是如何改善Andro…...

Positive Technologies:五分之四的网络攻击具有针对性

Positive Technologies 对 2023 年第二季度的相关网络威胁进行了分析。报告显示,自今年年初以来,有针对性的攻击数量增加了 10%,目前占 78%。专家们注意到利用漏洞的大规模攻击和大量用户个人数据的泄露。此外,在此期间&#xff0…...