2008-10-03 30 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")