io.StringIO 中的字符串的类文件输入/输出有类似的东西。
没有干净的方法可以将基于 url 的处理添加到正常的文件打开中,但是作为 Python 动态,您可以使用猴子补丁标准文件打开过程来处理这种情况。
例如:
from io import StringIO
old_open = open
in_memory_files = {}
def open(name, mode="r", *args, **kwargs):
if name[:1] == ":" and name[-1:] == ":":
# in-memory file
if "w" in mode:
in_memory_files[name] = ""
f = StringIO(in_memory_files[name])
oldclose = f.close
def newclose():
in_memory_files[name] = f.getvalue()
oldclose()
f.close = newclose
return f
else:
return old_open(name, mode, *args, **kwargs)
之后就可以写了
f = open(":test:", "w")
f.write("This is a test\n")
f.close()
f = open(":test:")
print(f.read())
请注意,此示例非常小,并不能处理所有真实文件模式(例如附加模式,或在读取模式下打开不存在的内存文件时引发适当的异常),但它可能适用于简单的案例。
另请注意,所有内存中的文件都将永远保留在内存中(除非您还修补了unlink)。
PS:我并不是说猴子补丁标准开放或StringIO 实例是一个好主意,只是你可以:-D
PS2:这种问题在操作系统级别通过创建 in-ram 磁盘得到了更好的解决。有了它,您甚至可以调用外部程序从这些文件重定向它们的输出或输入,并且您还可以获得所有的全面支持,包括并发访问、目录列表等。