【发布时间】:2013-09-04 04:47:36
【问题描述】:
因此,对于创建文件,我使用以下内容:
fileHandle = open('fileName', 'w')
然后将内容写入文件,关闭文件。 在下一步中,我将处理该文件。 在程序结束时,我得到了一个需要删除的“物理文件”。
有没有办法编写一个行为与“物理”文件完全相同的“虚拟”文件(允许以相同的方式对其进行操作)但在 Python 中运行结束时不存在?
【问题讨论】:
因此,对于创建文件,我使用以下内容:
fileHandle = open('fileName', 'w')
然后将内容写入文件,关闭文件。 在下一步中,我将处理该文件。 在程序结束时,我得到了一个需要删除的“物理文件”。
有没有办法编写一个行为与“物理”文件完全相同的“虚拟”文件(允许以相同的方式对其进行操作)但在 Python 中运行结束时不存在?
【问题讨论】:
您可以将 StringIO 用作虚拟文件, 来自官方documentation
from io import StringIO
output = 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()
【讨论】:
from io import StringIO for python >= 3
如果您的意思是写入内存而不是文件,您可以简单地将文本写入缓冲区并使用以下函数:
def write(text):
global buffer
buffer += text + '\n' # Add a linefeed as you would if you were writing to a file
buffer = "" # Initialize the buffer
write("My name is Steve Grafton")
最后,您将拥有一个缓冲区,就像您将内容写入文件然后打开文件并将其所有内容读取到缓冲区一样! 此外,您可以在此过程中(在完成写入之前)使用缓冲区并在其中进行搜索,就好像您已经创建了一个用于读取和写入的文件一样,只有在这种情况下,您的指针才会
【讨论】:
您可能需要考虑使用tempfile.SpooledTemporaryFile,它可以为您带来两全其美的效果,因为它最初会创建一个基于内存的临时虚拟文件,但如果数据不正确,它将自动切换到基于物理磁盘的文件保存在内存中的大小超过了指定的大小。
另一个不错的功能是(在使用内存时)它会自动使用 io.BytesIO 或 io.StringIO,具体取决于正在使用的 mode — 允许您读取和写入 Unicode 字符串或二进制数据(字节) 到它。
唯一棘手的部分可能是您需要避免在步骤之间关闭文件,因为这样做会导致它从内存或磁盘中删除。相反,您可以使用文件 seek(0) 方法调用将其倒回到开头。
当您完全完成文件并关闭它时,如果其中的数据量导致它滚动到物理文件,它将自动从磁盘中删除。
【讨论】:
tempfile.NamedSpooledTemporaryFile()(NamedTemporaryFile() 和SpooledTemporaryFile() 的组合)
tempfile.NamedSpooledTemporaryFile() 的原因是,说一些以基于内存的虚拟文件开头的东西可以保证在文件系统中有一个可见的名称是没有意义的——尽管它可能 如果其大小超过指定的max_size 阈值,则在某个时候有一个。 tempfile 模块的源代码在 python/Lib/tempfile.py 中,如果您想自己实现具有所需行为的某些东西(无论数据当前在内存中时可能是什么情况),这可能会有所帮助。
io 模块中有 StringIO 和 BytesIO。
StringIO 的行为类似于以文本模式打开的文件 - 读取和写入 unicode 字符串(相当于使用 io.open(filename, mode, encoding='...') 打开文件),BytesIO 的行为类似于以二进制模式打开的文件 (mode='[rw]b') ,并且可以读写字节。
Python 2:
In [4]: f = io.BytesIO('test')
In [5]: type(f.read())
Out[5]: str
In [6]: f = io.StringIO(u'test')
In [7]: type(f.read())
Out[7]: unicode
Python 3:
In [2]: f = io.BytesIO(b'test')
In [3]: type(f.read())
Out[3]: builtins.bytes
In [4]: f = io.StringIO('test')
In [5]: type(f.read())
Out[5]: builtins.str
有StringIO模块,阅读its documentation,应该很好用。
但请记住,这会将“文件”的内容保留在内存中。如果您有太多数据,最好创建一个真实文件,例如在 /tmp 中,然后将其删除。
【讨论】: