85

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

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

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

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

4

5 回答 5

80

您可能需要考虑使用tempfile.SpooledTemporaryFile它,它可以为您提供两全其美的体验,因为它最初会创建一个基于内存的临时虚拟文件,但如果内存中保存的数据超过指定的值,它将自动切换到基于物理磁盘的文件尺寸。

另一个不错的特性是(当使用内存时)它会根据正在使用的内容自动使用 anio.BytesIO或- 允许您读取和写入 Unicode 字符串或二进制数据(字节)。io.StringIOmode

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

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

于 2013-08-31T17:06:10.630 回答
56

你有StringIOBytesIOio模块中。

StringIO行为类似于以文本模式打开的文件 - 读取和写入 unicode 字符串(相当于使用 打开文件io.open(filename, mode, encoding='...')),BytesIO行为类似于以二进制模式打开的文件 ( mode='[rw]b'),并且可以读取写入字节。

蟒蛇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

蟒蛇 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
于 2013-08-31T16:16:45.643 回答
13

您可以使用 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()
于 2013-08-31T16:17:22.087 回答
0

StringIO模块,阅读它的文档,应该很容易使用。

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

于 2013-08-31T16:17:32.020 回答
0

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

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

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

于 2018-12-17T09:43:59.030 回答