5

我正在尝试使用 tempfile 模块。( http://docs.python.org/2.7/library/tempfile.html ) 我正在寻找一个临时文件,我可以打开几次以获取多个流来读取它。

tmp = ...
stream1 = # get a stream for the temp file
stream2 = # get another stream for the temp file

我尝试了几个函数(TemporaryFile、NamedTemporaryFile、SpooledTemporaryFile)并使用了 fileno 方法左右,但我无法执行我正在寻找的内容。

知道我应该自己上课吗?

谢谢

> 更新

尝试打开文件名时出错...

In [2]: t = tempfile.NamedTemporaryFile()
In [3]: t.write('abcdef'*1000000)
In [4]: t.name
Out[4]: 'c:\\users\\mike\\appdata\\local\\temp\\tmpczggbt'
In [5]: f = open(t.name)
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-6-03b9332531d2> in <module>()
----> 1 f = open(t.name)

IOError: [Errno 13] Permission denied: 'c:\\users\\mike\\appdata\\local\\temp\\tmpczggbt'
4

2 回答 2

8

如果不将文件位置重新定位回起点,则无法多次读取文件对象(无论它们是临时的还是其他)。

您的选择是:

  • 要多次重新打开文件,为同一个文件创建多个文件对象。
  • 在每次读取之前回退文件对象。

要重新打开文件,请使用 aNamedTemporaryFile并使用常规open()调用多次重新打开相同的文件名。您可能希望传递delete=False给构造函数,尤其是在 Windows 上,以便能够执行此操作。

要倒带,请调用.seek(0)文件对象。

于 2013-07-06T12:05:06.920 回答
1

你可以使用tempfile.mkstemp(). 从文档中:

以最安全的方式创建临时文件。假设平台正确实现了 os.open() 的 os.O_EXCL 标志,则文件创建中没有竞争条件。该文件只能由创建用户 ID 读写。如果平台使用权限位来指示文件是否可执行,则该文件不能被任何人执行。文件描述符不被子进程继承。

与 TemporaryFile() 不同,mkstemp() 的用户负责删除完成后的临时文件。

然后,您可以使用open()内置函数多次创建和打开该文件。完成后请记住删除文件,因为这不会自动完成。

于 2013-07-06T12:09:42.050 回答