2012-08-13 43 views
8

我試圖與Python 3使用mkstemp:如何從mkstemp()獲取文件對象?

Python 3.2.3 (default, Jun 25 2012, 23:10:56) 
[GCC 4.7.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from tempfile import mkstemp 
>>> mkstemp() 
(3, '/tmp/tmp080316') 

按照documentation,數組的第一個元素應該是一個文件句柄。事實上,這是一個整數。我如何獲得適當的文件對象?

回答

9

在爲mktemp的文檔,你可以看到如何使用NamedTemporaryFile一個例子,你想要的方式:http://docs.python.org/dev/library/tempfile.html?highlight=mkstemp#tempfile.mktemp

>>> f = NamedTemporaryFile(delete=False) 
>>> f 
<open file '<fdopen>', mode 'w+b' at 0x384698> 

這提供了相同的行爲,mkstemp,但返回一個文件對象。

+1

太棒了。我想使用'mkstemp',因爲該文件將包含敏感信息,並且錯過了NamedTemporaryFile實際使用它。 – Erik 2012-08-13 00:29:58

0

int代表操作系統級文件句柄。我真正需要的是一個更高級別的文件對象。爲了使一個,使用方法:

os_handle = mkstemp() 
f = open(mkstemp()[0]) 
+4

不要你的意思'OS .fdopen'? – 2012-08-13 00:28:47

+0

'os.fdopen'與'open'完全相同,只是它只接受文件句柄,沒有文件路徑。 – Erik 2012-08-13 00:30:41

+5

我不認爲這是真的:'open(0)'給了我* TypeError:脅迫Unicode:需要字符串或緩衝區,int找到*這是我的預期。至少,我認爲開放接受一個int不會很便攜。 **更新:**這適用於Python3,但不適用於Python2(如果你在意的話)。 – poolie 2012-08-17 07:53:44

2

我知道的最好的方法是使用tempfile.NamedTemporaryFile,正如你可以在@tordek的答案中看到的那樣。

但是如果你從底層的操作系統有一個原始FD,你可以做到這一點,使之成爲一個文件對象:

f = open(fd, closefd=True) 

這工作在Python 3

相關問題