【问题标题】:Python - How do I convert "an OS-level handle to an open file" to a file object?Python - 如何将“操作系统级句柄到打开的文件”转换为文件对象?
【发布时间】:2010-09-15 04:14:19
【问题描述】:

tempfile.mkstemp() 返回:

一个元组,包含一个打开文件的操作系统级句柄(将由 os.open() 返回)和该文件的绝对路径名,按此顺序。

如何将该操作系统级句柄转换为文件对象?

documentation for 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

【问题讨论】:

  • 如果对您有用,请记得将答案标记为“已接受”。

标签: python temporary-files mkstemp fdopen


【解决方案1】:
temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foo\n')
temp.close()

【讨论】:

  • “delete”参数是在 2.6 版中添加的,因此不适用于较旧的 Python 版本。
【解决方案2】:

我无法对答案发表评论,所以我将在这里发表我的评论:

要为写访问创建一个临时文件,您可以使用 tempfile.mkstemp 并将“w”指定为最后一个参数,例如:

f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")

【讨论】:

    【解决方案3】:

    以下是使用 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')
    

    【讨论】:

    • closing 真的有必要吗? os.fdopen 返回一个 TextIOWrapper__exit__ 原来关闭它,在 Python 3.5 (CPython) 上测试。
    【解决方案4】:

    你的目标是什么? tempfile.TemporaryFile 不适合您的目的吗?

    【讨论】:

    • 我不希望文件一关闭就被销毁。 (而且我想确保文件是可见的。)
    • 然后您可以将 delete=False 传递给 NamedTemporaryFile
    【解决方案5】:

    你可以使用

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

    写入句柄。

    如果要打开句柄进行书写需要添加"w"模式

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

    【讨论】:

    • 这行得通——谢谢。但从技术上讲 fdopen 返回一个文件对象(并且你传入一个文件描述符),所以如果我可以编辑你的答案,我会将其更改为 "f = os.fdopen(tup[0], "w");f.write ("foo")
    • 如果你不使用os.fdopen,你需要确保你根据logilab.org/blogentry/17873使用os.close(tup[0])关闭临时文件句柄。
    【解决方案6】:

    您忘记在 fdopen() 中指定打开模式 ('w')。默认为 'r',导致 write() 调用失败。

    我认为 mkstemp() 创建只读文件。使用 'w' 调用 fdopen 可能会重新打开它以进行写入(您可以重新打开由 mkstemp 创建的文件)。

    【讨论】:

    • 一个仅供阅读的临时(因此为空)文件将毫无用处。 mkstemp 根据文档字符串返回以二进制模式打开的文件以进行读写。
    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2017-07-19
    • 2017-05-15
    • 2012-09-11
    • 1970-01-01
    • 2021-04-06
    • 2018-03-16
    • 2011-04-03
    相关资源
    最近更新 更多