Python - 如何将“操作系统级别的打开文件句柄”转换为文件对象?

61 投票
6 回答
23536 浏览
提问于 2025-04-11 09:29

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

6 个回答

6

你忘了在fdopen()里指定打开模式('w')。默认是'r',这就导致write()调用失败了。

我觉得mkstemp()创建的文件只能读取。用'w'来调用fdopen可能会重新打开这个文件以便写入(你可以重新打开mkstemp创建的文件)。

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')
60

你可以使用

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

来写入这个句柄。

如果你想要打开这个句柄进行写入,你需要加上"w"模式。

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

撰写回答