约 1503 字

约 8 分钟

#Python 的内存 I/O

文件 I/O 是对硬盘(外存)的操作,很多情况下,需要在内存中存储并操作数据(例如网页上动态生成图片、压缩包),在 Python 中可以使用 StringIO 和 BytesIO 实现这一点。

#StringIO

StringIO 顾名思义,是对字符串的 I/O 操作,和文件 I/O 一样,支持 read,write,tell,seek 等方法;并可以通过 getvalue 方法获取完整的字符串。

import io
from io import StringIO

stream = StringIO("甲乙丙丁戊己庚辛壬癸")   # 创建 StringIO 对象
print("初始偏移为", stream.tell())          # 查看初始偏移
print(stream.read(3))                       # 读取 3 个字符
stream.seek(6, io.SEEK_SET)                 # 将偏移量设为,文件开头 + 6 字符
print(stream.read(3))                       # 读取 3 个字符
stream.seek(0, io.SEEK_SET)                 # 将偏移量设为,文件开头
stream.write("ABC")                         # 在中间写入,会进行覆盖
print(stream.getvalue())                    # 获取整个字符串

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#BytesIO

BytesIO 顾名思义,是对字节数据的 I/O 操作,和文件 I/O 一样,支持 read,write,tell,seek 等方法;并可以通过 getvalue 方法获取完整的 bytes。

import io
from io import BytesIO

stream = BytesIO(b"ABCDEFGHIJKLMNOPQRSTUVWXYZ")     # 创建 BytesIO 对象
print("初始偏移为", stream.tell())                  # 查看初始偏移
print(stream.read(3))                               # 读取 3 个字节
stream.seek(6, io.SEEK_SET)                         # 将偏移量设为,文件开头 + 6 字节
print(stream.read(3))                               # 读取 3 个字节
stream.seek(0, io.SEEK_SET)                         # 将偏移量设为,文件开头
stream.write(b"XXX")                                # 在中间写入,会进行覆盖
print(stream.getvalue())                            # 获取整个字符串

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

更新: 2025/6/9

作者: PlanC

创建: 2025/6/9