Python StringIO 和 BytesIO 用法

在 Python 中,我们平时处理的输入输出(I/O)大多数是针对文件或网络数据的,但有时候,我们希望直接在内存中进行读写 ,而不必先把数据存到硬盘上。

这时候,StringIOBytesIO 就派上用场了。

参考文章:Python StringIO 和 BytesIO | 简单一点学习 easyeasy.me

简单理解:

  • StringIO → 操作内存中的 字符串str 类型)
  • BytesIO → 操作内存中的 二进制数据bytes 类型)

它们都来自 io 模块,接口和文件对象几乎一模一样,所以学会文件操作就能直接用它们。


1. 为什么要用 StringIO / BytesIO

  • 无需磁盘 I/O,速度快
  • 便于测试(不需要真实文件)
  • 在网络编程中常用(比如 HTTP 响应先存在内存中再处理)
  • 数据临时存储(比如生成报告、图片)

2. StringIO 基础用法

StringIO 适合处理 文本数据,使用方式类似普通文件:

python 复制代码
from io import StringIO

# 创建 StringIO 对象
f = StringIO()

# 写入数据
f.write("Hello ")
f.write("Python")

# 获取当前内容
print(f.getvalue())  # Hello Python

注意:getvalue() 用来获取缓冲区的全部数据。


3. StringIO 读取数据

我们也可以直接用 StringIO 来模拟读取文件:

python 复制代码
from io import StringIO

data = "Line1\nLine2\nLine3"
f = StringIO(data)

# 一次性读取
print(f.read())

# 重置游标
f.seek(0)

# 按行读取
for line in f:
    print(line.strip())

要点:

  • seek(0) → 把"文件指针"移动到开头
  • 读取方法(readreadlinereadlines)和文件对象一致

4. BytesIO 基础用法

BytesIO 用于处理 二进制数据,比如图片、音频、压缩包等。

python 复制代码
from io import BytesIO

# 创建 BytesIO
f = BytesIO()

# 写入二进制数据
f.write(b"Hello World")

# 获取数据
print(f.getvalue())  # b'Hello World'

5. BytesIO 读取数据

python 复制代码
from io import BytesIO

data = b"Binary\x00Data"
f = BytesIO(data)

# 读取前6个字节
print(f.read(6))  # b'Binary'

# 继续读剩下的
print(f.read())   # b'\x00Data'

6. StringIO vs BytesIO 区别

特性 StringIO BytesIO
处理数据类型 str(文本) bytes(二进制)
读取写入方式 和文本文件一致 和二进制文件一致
编码解码 不需要手动编码 需要自己 .encode() / .decode()
常见应用 日志处理、临时文本 图片、音频、网络传输数据

7. 从文件到内存的转换

有时我们需要把磁盘文件内容读到内存中用 BytesIO 处理,比如处理图片:

python 复制代码
from io import BytesIO

# 假设有个图片
with open("test.png", "rb") as f:
    data = f.read()

# 存入 BytesIO
bio = BytesIO(data)

# 读取前10个字节
print(bio.read(10))

8. 从内存保存到文件

反过来,我们也可以把 BytesIOStringIO 的数据写到磁盘:

python 复制代码
from io import BytesIO

# 创建内存数据
bio = BytesIO()
bio.write(b"Save me to file")

# 写入文件
with open("output.bin", "wb") as f:
    f.write(bio.getvalue())

9. 常见使用场景

  1. 临时构建数据,避免磁盘 I/O
  2. 测试代码时,模拟文件对象
  3. 网络数据处理(HTTP 请求、Socket 传输)
  4. 图片或音频处理(配合 Pillow、pydub 等库)

10. 最佳实践

  • 如果处理的是文本,用 StringIO,并且直接写 str 类型。
  • 如果处理的是二进制数据(比如图片、压缩包),用 BytesIO,并且确保写入的是 bytes
  • 操作完成后不一定非要 close()(因为它们是内存对象),但为了习惯最好加上。
  • 需要频繁读取时,记得用 seek(0) 重置指针。
相关推荐
jay神24 分钟前
深度学习的优化器应该怎么选?
人工智能·python·深度学习·毕业设计·课程设计
桦说编程7 小时前
并发编程中的等待-通知模式:从 wait/notify 到 Guava Monitor
后端
用户938515635078 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
用户938515635078 小时前
实战 Todo CRUD —— 从路由到异常,手写一个完整模块
后端·typescript·nestjs
XLYcmy8 小时前
京东 算法实习一面 下+手撕
c++·python·llm·概率论·数据处理·训练·codebert
虎头金猫8 小时前
如何在群晖NAS上通过Docker部署CloudSaver?群晖部署CloudSaver教程|聚合资源搜索并实现远程访问
运维·服务器·网络·python·docker·容器·pandas
从零开始学习人工智能8 小时前
WSL2部署CUDA12+cuDNN9踩坑实录:ONNX Runtime GPU推理环境搭建全流程
python
m0_380743879 小时前
从零调用 Claude 教程
开发语言·python·node.js
GetcharZp9 小时前
Qdrant 向量数据库 Golang 实战指南:从零构建高性能检索应用
后端
hsfxuebao9 小时前
OpenSpec 完整使用流程笔记 (SDD)
后端