如何做虚拟文件处理?
所以为了创build文件我使用以下内容:
fileHandle = open('fileName', 'w')
然后将内容写入文件,closures文件。 在下一步我处理文件。 在程序结束时,我最终得到一个我需要删除的“物理文件”。
有没有办法编写一个“虚拟”文件,其行为与“物理”文件完全相同(允许以相同方式操作),但在Python运行结束时不存在?
您可能需要考虑使用tempfile.SpooledTemporaryFile
,它可以为您提供两全其美的意义,它将最初创build一个基于内存的临时虚拟文件,但如果数据保存在内存中,将自动切换到物理的基于磁盘的文件超过指定的尺寸。
另一个不错的特性是(使用内存时),它将自动使用io.BytesIO
或io.StringIO
具体取决于正在使用的mode
– 允许您读取和写入Unicodestring或二进制数据(字节)。
唯一棘手的部分可能是您需要避免在步骤之间closures文件,因为这样做会导致文件从内存或磁盘中删除。 相反,你可以通过一个文件seek(0)
方法调用将它倒回到开头。
当您完成文件并closures它时,如果文件中的数据量导致它被滚存到物理文件,它将自动从磁盘中删除。
你在io
模块中有StringIO
和BytesIO
。
StringIO
行为就像在文本模式下打开的文件 – 读写unicodestring(相当于用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作为虚拟文件
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()
有StringIO
模块,阅读它的文档 ,应该很容易使用。
但请记住,这将使“文件”的内容保留在内存中。 如果数据太多,最好创build一个真实的文件,例如在/ tmp中,然后删除它。