2008-10-03 37 views
48

tempfile.mkstemp()回报:Python - 如何将“操作系统级句柄转换为打开文件”转换为文件对象?

含有OS级句柄打开的文件和该文件的绝对路径名(如将由os.open()被返回),在该顺序的元组。

如何将该OS级句柄转换为文件对象?

documentation for 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 
+0

切记要一个答案,“接受”,如果它为你工作。 – 2008-10-03 20:18:27

回答

49

您可以使用

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

写入手柄。

如果你要打开的句柄写你需要在fdopen添加“W”模式

f = os.fdopen(tup[0], "w") 
f.write("foo") 
+1

这工作 - 谢谢。但技术上fdopen返回一个文件对象(并传入一个文件描述符),所以如果我可以编辑你的答案,我会改变它为“f = os.fdopen(tup [0],”w“); f.write (“foo”) – 2008-10-03 20:03:14

+0

如果您不使用`os.fdopen`,则需要确保根据http://www.logilab.org使用os.close(tup [0])关闭临时文件句柄/ blogentry/17873 – deterb 2015-02-20 18:17:09

6

你忘了指定的开放模式(“W”)()。缺省值是'r',导致write()调用失败。

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

1

你的目标是什么?是tempfile.TemporaryFile不适合你的目的?

+0

我不希望文件在关闭时被破坏(并且我想确保文件可见) – 2009-08-18 19:37:17

+3

然后您可以将delete = False传递给NamedTemporaryFile – hoju 2010-03-10 03:29:43

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') 
4
temp = tempfile.NamedTemporaryFile(delete=False) 
temp.file.write('foo\n') 
temp.close() 
0

我不能对答案进行评论,所以我会在这里发表我的评论:

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

f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'... 
os.write(f[0], "write something")