【问题标题】:Python's tempfile.mkstemp() returning an integer instead of a file handle?Python 的 tempfile.mkstemp() 返回一个整数而不是文件句柄?
【发布时间】:2018-04-03 21:23:11
【问题描述】:

根据tempfile.mkstemp docs

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]) 来获取文件句柄吗?为什么不返回文件句柄?

【问题讨论】:

  • 如果你想要一个真正的类似文件的 object,而不是文件 handle(又名文件 descriptor,一个普通的int),使用更高级别的类,like tempfile.NamedTemporaryFile。这将为您提供一个打开的文件对象,并且该对象的 .name 属性将提供名称。奖励:关闭时,临时文件会自动为您删除(或者如果您想保留它,您可以使用delete=False 构建;是否删除它取决于您)。 NamedTemporaryFile 是根据mkstemp 实现的,所以同样安全。

标签: python temporary-files


【解决方案1】:

这是预期行为,因为操作系统级别的 file handles 是整数。

several functions in the os module 会接受这样的整数:

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

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

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

但是,如果您想要的只是一个临时文件作为 Python 文件对象,只需坚持使用 temp 模块的高级函数,例如 tempfile.TemporaryFile()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2022-12-28
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多