sui*_*kan 5 python file python-3.x
(我正在研究Python 3.4项目.)
有一种方法可以在内存中打开(sqlite3)数据库:
with sqlite3.connect(":memory:") as database:
Run Code Online (Sandbox Code Playgroud)
open()函数是否存在这样的技巧?就像是 :
with open(":file_in_memory:") as myfile:
Run Code Online (Sandbox Code Playgroud)
这个想法是加快一些测试功能,打开/读取/写入磁盘上的一些短文件; 有没有办法确保这些操作发生在内存中?
atu*_*pal 12
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()
Run Code Online (Sandbox Code Playgroud)
python3:io.StringIO
类似于类似文件的输入/输出与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)
Run Code Online (Sandbox Code Playgroud)
之后你就可以写了
f = open(":test:", "w")
f.write("This is a test\n")
f.close()
f = open(":test:")
print(f.read())
Run Code Online (Sandbox Code Playgroud)
注意,这个例子是非常少的,不能处理所有真正的文件模式(如追加模式,或提高在读模式在内存中的文件打开正确的例外是不存在的),但它可以用于简单的情况下工作.
另请注意,所有内存中文件将永久保留在内存中(除非您还要修补unlink).
PS:我不是说猴子修补标准打开或StringIO实例是一个好主意,只是你可以:-D
PS2:通过创建in-ram磁盘,可以在操作系统级别更好地解决此类问题.有了它,你甚至可以调用外部程序重定向他们的输出或从这些文件输入,你也得到所有的全面支持,包括并发访问,目录列表等.
| 归档时间: |
|
| 查看次数: |
16666 次 |
| 最近记录: |