【问题标题】:Can't access temporary files created with tempfile无法访问使用 tempfile 创建的临时文件
【发布时间】:2026-01-15 21:40:01
【问题描述】:

我正在使用tempfile.NamedTemporaryFile() 存储一些文本,直到程序结束。在 Unix 上工作没有任何问题,但在 Windows 上,返回的文件无法读取或写入:python 提供 Errno 13。唯一的方法是设置 delete=False 并使用 os.remove() 手动删除文件。为什么?

【问题讨论】:

  • 你能告诉我们你使用它的代码吗?需要 delete=False 作为解决方法意味着它已被删除,因为您关闭了文件。
  • 好的,我找到了问题所在。有时需要删除文件,为此我使用open(tempfile.name,"w").close()。这会导致 IOError,因为文件在创建后只能打开一次。现在,如何在不再次打开的情况下擦除其内容?
  • 我想你想截断文件;打电话给.seek(0) 然后.truncate()
  • @MartijnPieters 这似乎有效,谢谢。
  • @Rnhmjoj close() 具有魔力!拯救了我的一天!

标签: python windows


【解决方案1】:

这会导致 IOError,因为文件在创建后只能打开一次。

原因是NamedTemporaryFile 在 Windows 上创建带有FILE_SHARE_DELETE 标志的文件。在 Windows 上,当使用特定共享标志创建/打开文件时,所有后续打开操作都必须传递此共享标志。 Python 的 open 函数不是这种情况,它不传递 FILE_SHARE_DELETE 标志。有关更多详细信息和解决方法,请参阅我对 How to create a temporary file that can be read by a subprocess? 问题的回答。

【讨论】:

    【解决方案2】:

    看一看:http://docs.python.org/2/library/tempfile.html

     tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
    

    这个函数的操作与 TemporaryFile() 完全一样,除了文件保证在文件系统中有一个可见的名称(在 Unix 上,目录条目没有取消链接)。该名称可以从文件对象的名称属性中检索。该名称是否可用于第二次打开文件,而命名的临时文件仍处于打开状态,因平台而异(在 Unix 上可以这样使用;在 Windows NT 或更高版本上不能) .如果 delete 为 true(默认),则文件一关闭就会被删除。

    【讨论】:

    • 我刚刚尝试使用 TemporaryFile():同样的问题。问题一定是别的。
    【解决方案3】:

    感谢@Rnhmjoj,这是一个可行的解决方案:

        file = NamedTemporaryFile(delete=False)
        file.close()
    

    您必须保留带有delete-flag 的文件,然后在创建后将其关闭。这样,Windows 将解锁文件,您可以使用它来做任何事情!

    【讨论】: