所以我使用以下方法创建文件:
fileHandle = open('fileName', 'w')
将内容写入文件,关闭文件。接下来我会处理这个文件。在程序结束时,我需要删除一个“物理文件”。
在Python中有没有一种方法可以编写一个“虚拟”文件,它的行为方式与“物理”文件完全相同(允许以相同的方式进行操作),但在运行结束时不存在?
tempfile.SpooledTemporaryFile
,它能够兼顾两种优点: 一开始会创建一个基于内存的临时虚拟文件,当内存中的数据超过指定大小时,它会自动转换为基于物理磁盘的文件。mode
自动使用io.BytesIO
或io.StringIO
——允许您向其中读写Unicode字符串或二进制数据(字节)。seek(0)
方法将其倒回到开头。在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作为虚拟文件,来自官方文档
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()
有 StringIO
模块,阅读其文档,应该很容易使用。
请记住,这将在内存中保留“文件”的内容。如果您有太多数据,最好创建一个真实的文件,例如在 /tmp 中,并在使用后删除它。
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.NamedSpooledTemporaryFile()
(NamedTemporaryFile()
和SpooledTemporaryFile()
的组合)这一功能。 - WoJtempfile.NamedSpooledTemporaryFile()
的原因是,一个起始于基于内存的虚拟文件的东西不可能保证在文件系统中有一个可见的名称——尽管如果它的大小超过了指定的max_size
阈值,它 可能 会有一个名称。tempfile
模块的源代码位于python/Lib/tempfile.py
,如果您想要自己实现所需的行为(无论当前数据是否在内存中),这可能会有所帮助。 - martineau