2012-08-13 44 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

相关问题