Python的tempfile.mkstemp()返回一个整数而不是一个文件句柄?

7
根据 tempfile.mkstemp 文档 mkstemp() 返回一个包含打开文件的操作系统级句柄(与 os.open() 返回的一样)和该文件的绝对路径名的元组。

然而,从这些 shell 命令中看来,元组的第一个成员是一个整数,而不是文件句柄:

>>> temp = tempfile.mkstemp(suffix='.html')

>>> temp
(17, '/var/folders/dc/nv4yxcrd0zqd2dtxlj281b740000gn/T/tmpktmb2gjg.html')

>>> type(temp[0])
int

我必须使用open(temp[1])来获取文件句柄吗?为什么它没有返回一个文件句柄?


1
如果你想要一个实际的类似文件的对象,而不是一个文件句柄(也称为文件描述符,一个普通的int),请使用更高级别的类,比如tempfile.NamedTemporaryFile。这将为您提供一个打开的文件对象,对象的.name属性将提供名称。额外福利:当关闭时,临时文件会自动删除(或者如果您想保留它,则构造时使用delete=False;由您决定是否删除)。NamedTemporaryFile是基于mkstemp实现的,因此同样安全。 - ShadowRanger
1个回答

6

这是预期行为,因为操作系统级别的 文件句柄 是整数。

os 模块中有 几个函数 可以接受这样的整数:

这些函数操作使用文件描述符引用的 I/O 流。

文件描述符是与当前进程打开的文件相对应的小整数。例如,标准输入通常是文件描述符 0,标准输出是 1,标准错误是 2。然后该进程打开的其他文件将被分配为 3、4、5 等等。名称“文件描述符”略微具有欺骗性;在 Unix 平台上,套接字和管道也由文件描述符引用。

它们不是 Python 文件对象,但您可以使用 io.FileIO() 为给定的描述符创建 Python 文件对象。

然而,如果你只需要一个Python文件对象作为临时文件,只需使用temp模块的更高级函数,如tempfile.TemporaryFile()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接