跳转至

Python StringIO 模块

概念与用途

io.StringIO 在内存中模拟文本文件,支持 read、write、seek 等文件 API。它适合测试接受文件对象的函数、临时文本生成和捕获输出。

核心 API

构造器可传初始文本,getvalue() 获取全部内容,seek() 移动位置,close() 释放缓冲。二进制数据应使用 io.BytesIO。

from io import StringIO

buffer = StringIO()
buffer.write("name,score\n")
buffer.write("Alice,95\n")
print(buffer.getvalue())
buffer.seek(0)
print(buffer.readline().strip())
buffer.close()

API 行为

API 作用 注意
write() 从当前位置写入 返回字符数
read() 从当前位置读取 可能得到空字符串
seek() 修改当前位置 文本流复杂位置有限制
truncate() 截断内容 默认截到当前位置

示例:作为函数依赖注入

from io import StringIO

def write_report(stream, values: list[int]) -> None:
    stream.write(f"count={len(values)}\n")
    stream.write(f"total={sum(values)}\n")

output = StringIO()
write_report(output, [2, 3, 5])
assert output.getvalue() == "count=3\ntotal=10\n"
print(output.getvalue(), end="")

StringIO 是标准库,无需安装,也不涉及外部资源。让函数接受文本流而不是固定文件路径,可在测试中使用内存流、生产中使用真实文件或标准输出。

常见错误与工程注意

  • 写入后读取前要注意当前位置,通常需要 seek(0)。
  • 关闭后不能再 getvalue(),需要内容时应在关闭前获取。
  • 超大内容仍占用内存,流式输出应写真实文件或分块消费者。