如何在Python中创建可通过open()调用的类似stdin的自定义流?
关于内存/临时流替代变量存储大数据的方案
核心结论
不需要用subprocess——Python内置了多种适合存储临时大数据的流/类文件对象,完全能满足你的需求。
具体方案
1. 内存流:io.BytesIO / io.StringIO
这两个类会在内存中创建类文件对象,行为和普通文件完全一致,支持read()/write()/seek()等方法,无需写入磁盘,适合处理内存能容纳的大数据。你可以像操作文件一样读写,不用把数据全存在单个变量里。
示例代码:
import io # 处理二进制数据用BytesIO stream = io.BytesIO() stream.write(b"这是一段大体积的二进制临时数据") # 移到流开头,准备读取 stream.seek(0) data = stream.read() # 处理文本数据用StringIO text_stream = io.StringIO() text_stream.write("大体积文本临时数据") text_stream.seek(0) text_data = text_stream.read()
2. 磁盘临时文件:tempfile模块
如果数据大到内存无法容纳,用临时文件更合适。tempfile.NamedTemporaryFile会创建一个临时文件,返回的对象可直接读写,还能通过name属性获取文件路径,后续用open()重新打开(注意设置delete=False的话,文件不会在关闭后自动删除,否则关闭即销毁)。
示例代码:
import tempfile import os # 创建临时文件,delete=False表示关闭后不自动删除 with tempfile.NamedTemporaryFile(mode='wb', delete=False) as f: f.write(b"超大型临时数据,内存装不下的那种") temp_path = f.name # 后续可以用open()打开这个临时文件 with open(temp_path, 'rb') as f: data = f.read() # 用完手动删除临时文件(如果设置了delete=False) os.unlink(temp_path)
关于subprocess的说明
subprocess是用来调用外部进程、处理进程间通信的工具,和你存储程序内部临时数据的需求完全不相关,没必要用它。stdin/stdout/stderr是进程间的管道流,而上面的方案是针对程序内部数据的存储与处理设计的,更贴合你的场景。
内容的提问来源于stack exchange,提问作者user19926715
相关产品推荐
相关产品推荐

