打开内存中的文件



(我正在做一个Python 3.4项目。)

有一种方法可以在内存中打开(sqlite3)数据库:

    with sqlite3.connect(":memory:") as database:

open()函数是否存在这样的技巧?类似于:

   with open(":file_in_memory:") as myfile:

这个想法是为了加快一些测试功能在磁盘上打开/读取/写入一些短文件;有没有办法确保这些操作发生在内存中?

StringIO:怎么样

import StringIO
output = StringIO.StringIO()
output.write('First line.n')
print >>output, 'Second line.'
# Retrieve file contents -- this will be
# 'First line.nSecond line.n'
contents = output.getvalue()
# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()

python3:io.StringIO

在io.StringIO.中,类似文件的输入/输出与字符串类似

没有一种干净的方法可以将基于url的处理添加到正常的文件打开中,但由于是Python动态的,您可以使用monkey-patch标准文件打开过程来处理这种情况。

例如:

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 testn")
f.close()
f = open(":test:")
print(f.read())

请注意,这个例子非常简单,不能处理所有真实的文件模式(例如,附加模式,或在读取模式下打开不存在的内存中文件时引发适当的异常),但它可能适用于简单的情况。

还要注意,所有内存中的文件都将永远保留在内存中(除非您也修补了unlink)。

附言:我并不是说monkey补丁标准开放或StringIO实例是个好主意,只是你可以:-D

PS2:通过创建一个内存磁盘,这种问题可以在操作系统级别得到更好的解决。有了它,您甚至可以调用外部程序来重定向这些文件的输出或输入,还可以获得所有的全面支持,包括并发访问、目录列表等。

io.StringIO提供了一个内存文件实现,可用于模拟真实文件。文档示例:

import io
output = io.StringIO()
output.write('First line.n')
print('Second line.', file=output)
# Retrieve file contents -- this will be
# 'First line.nSecond line.n'
contents = output.getvalue()
# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()

在Python2中,这个类可以作为StringIO.StringIO使用。

相关内容

  • 没有找到相关文章

最新更新