57

tempfile.mkstemp()返回:

一个元组,包含一个打开文件的操作系统级句柄(将由 os.open() 返回)和该文件的绝对路径名,按此顺序。

如何将该操作系统级句柄转换为文件对象?

os.open()的文档指出:

要将文件描述符包装在“文件对象”中,请使用 fdopen()。

所以我尝试了:

>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foo\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
4

6 回答 6

57

您可以使用

os.write(tup[0], "foo\n")

写入句柄。

如果你想打开句柄写你需要添加“w”模式

f = os.fdopen(tup[0], "w")
f.write("foo")
于 2008-10-03T19:47:17.260 回答
13

以下是使用 with 语句的方法:

from __future__ import with_statement
from contextlib import closing
fd, filepath = tempfile.mkstemp()
with closing(os.fdopen(fd, 'w')) as tf:
    tf.write('foo\n')
于 2009-08-18T19:44:31.530 回答
7

您忘记在 fdopen() 中指定打开模式 ('w')。默认值为 'r',导致 write() 调用失败。

我认为 mkstemp() 创建只读文件。使用 'w' 调用 fdopen 可能会重新打开它以进行写入(您可以重新打开由 mkstemp 创建的文件)。

于 2008-10-03T20:00:14.613 回答
4
temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foo\n')
temp.close()
于 2010-03-10T03:33:07.397 回答
2

你的目标是什么,在这里?不tempfile.TemporaryFile适合您的目的吗?

于 2008-10-03T20:19:54.730 回答
0

我无法对答案发表评论,所以我将在这里发表我的评论:

要为写访问创建临时文件,您可以使用 tempfile.mkstemp 并将“w”指定为最后一个参数,例如:

f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")
于 2013-06-05T14:15:44.287 回答