【问题标题】:How to do virtual file processing?如何进行虚拟文件处理?
【发布时间】:2013-09-04 04:47:36
【问题描述】:

因此,对于创建文件,我使用以下内容:

fileHandle = open('fileName', 'w')

然后将内容写入文件,关闭文件。 在下一步中,我将处理该文件。 在程序结束时,我得到了一个需要删除的“物理文件”。

有没有办法编写一个行为与“物理”文件完全相同的“虚拟”文件(允许以相同的方式对其进行操作)但在 Python 中运行结束时不存在?

【问题讨论】:

    标签: python file virtual


    【解决方案1】:

    您可以将 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()
    

    【讨论】:

    • 记住,如果你想把它作为一个类似文件的对象传递给另一个函数,你应该使用: output.seek(0) 来回退虚拟文件
    • 哥们,你是从官方文档中复制粘贴的吗? :) 我认为在这种情况下使用链接是公平的。
    • @maxadamo 完成。谢谢。
    • from io import StringIO for python >= 3
    【解决方案2】:

    如果您的意思是写入内存而不是文件,您可以简单地将文本写入缓冲区并使用以下函数:

    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")
    

    最后,您将拥有一个缓冲区,就像您将内容写入文件然后打开文件并将其所有内容读取到缓冲区一样! 此外,您可以在此过程中(在完成写入之前)使用缓冲区并在其中进行搜索,就好像您已经创建了一个用于读取和写入的文件一样,只有在这种情况下,您的指针才会

    【讨论】:

      【解决方案3】:

      您可能需要考虑使用tempfile.SpooledTemporaryFile,它可以为您带来两全其美的效果,因为它最初会创建一个基于内存的临时虚拟文件,但如果数据不正确,它将自动切换到基于物理磁盘的文件保存在内存中的大小超过了指定的大小。

      另一个不错的功能是(在使用内存时)它会自动使用 io.BytesIOio.StringIO,具体取决于正在使用的 mode — 允许您读取和写入 Unicode 字符串或二进制数据(字节) 到它。

      唯一棘手的部分可能是您需要避免在步骤之间关闭文件,因为这样做会导致它从内存或磁盘中删除。相反,您可以使用文件 seek(0) 方法调用将其倒回到开头。

      当您完全完成文件并关闭它时,如果其中的数据量导致它滚动到物理文件,它将自动从磁盘中删除。

      【讨论】:

      • 从另一个问题来到这里,值得注意的是这个临时内存文件没有文件名(需要对处理程序进行操作)。该解决方案非常适合 OP 使用(+1)。不幸的是,模块中缺少的是tempfile.NamedSpooledTemporaryFile()NamedTemporaryFile()SpooledTemporaryFile() 的组合)
      • @WoJ:感谢您的 +1。我认为没有tempfile.NamedSpooledTemporaryFile() 的原因是,说一些以基于内存的虚拟文件开头的东西可以保证在文件系统中有一个可见的名称是没有意义的——尽管它可能 如果其大小超过指定的max_size 阈值,则在某个时候有一个。 tempfile 模块的源代码在 python/Lib/tempfile.py 中,如果您想自己实现具有所需行为的某些东西(无论数据当前在内存中时可能是什么情况),这可能会有所帮助。
      【解决方案4】:

      io 模块中有 StringIOBytesIO

      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
      
      【解决方案5】:

      StringIO模块,阅读its documentation,应该很好用。

      但请记住,这会将“文件”的内容保留在内存中。如果您有太多数据,最好创建一个真实文件,例如在 /tmp 中,然后将其删除。

      【讨论】:

        猜你喜欢
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 2019-09-25
        • 2011-10-21
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多