为啥即使在关闭临时文件后我也能够写入和读取它?

Posted

技术标签:

【中文标题】为啥即使在关闭临时文件后我也能够写入和读取它?【英文标题】:Why am I able to write to and read a tempfile even after closing it?为什么即使在关闭临时文件后我也能够写入和读取它? 【发布时间】:2018-11-11 06:34:19 【问题描述】:

我正在尝试从我的 python 脚本中打开文本编辑器,我注意到一些显然与我对 tempfile 文档的理解相矛盾的东西。

我的实验从 Alex Martelli 的 answer 开始。 我的代码 -

import os
import tempfile
import subprocess

f = tempfile.NamedTemporaryFile(mode='w+t', delete=True)
n = f.name
print('Does exist? : 0'.format(os.path.exists(n)))
f.close()
print('Does exist? : 0'.format(os.path.exists(n)))

subprocess.run(['nano', n])
with open(n) as f:
    print (f.read())

print('Does exist? : 0'.format(os.path.exists(n)))

输出:

Does exist? : True
Does exist? : False
Hello from temp file.

Does exist? : True

在代码中,我在用delete=True 声明的文件对象上显式调用close,但是即使这样我也可以对其进行写入和读取内容。我不明白为什么会这样。 根据文档-

如果 delete 为 true(默认值),则文件一关闭就会被删除。

如果调用close 会删除文件,那么我不应该能够写入然后读取它。但它会显示您在nano 执行时输入的文件的正确 内容。和 tempfile 一样,该文件在我打开终端并运行脚本的目录中不可见。 更奇怪的是,os.path.exists 前两次正常工作,而第三次可能不正确。 我在这里错过了什么吗?

附加实验: 如果我运行以下代码,那么我可以清楚地看到创建的文件。但这在原始代码中不会发生。

n = '.temp'
subprocess.run(['nano', n])
with open(n) as f:
    print (f.read())

print('Does exist? : 0'.format(os.path.exists(n)))

【问题讨论】:

来自文档“如果 delete 为 true(默认),则文件一关闭就会被删除。” 我无法重现您的错误。文件一关闭就被删除。 @DYZ 对不起,我忘了添加输出。现已编辑。没有错误。问题是它不应该工作。为什么它有效? 好的。是 nano 再次创建您的临时文件。 【参考方案1】:

让我们更深入地了解您的代码。

首先你创建你的临时文件

f = tempfile.NamedTemporaryFile(mode='w+t', delete=True)
n = f.name
print('Does exist? : 0'.format(os.path.exists(n)))

这个输出

Does exist? : True

所以没有什么可担心的。然后在接下来的语句中

f.close()
print('Does exist? : 0'.format(os.path.exists(n)))

你正在关闭文件,实际上文件被删除了,因为你得到了以下输出:

Does exist? : False

然而,你正在通过

重新创建你的文件
subprocess.run(['nano', n])
with open(n) as f:
    print (f.read())

所以这就是为什么之后的命令

print('Does exist? : 0'.format(os.path.exists(n)))

返回

Does exist? : True

【讨论】:

是的,完全正确。但是为什么我实际上看不到工作目录中的文件呢?我已编辑问题以添加此信息。我只写了代码的最后一部分,在那里我可以看到它创建了临时文件。但是为什么在原版中看不到呢? @raj tempfile 不是在工作目录中创建文件,而是在临时文件目录中创建文件。所以你永远不会在工作目录中看到该文件。 @raj 在/tmp 中打开一个临时文件。 @DYZ 不一定,例如您也可以更改工作目录的路径(linux:***.com/questions/31068/… windows:answers.microsoft.com/en-us/windows/forum/windows_7-files/…)-但在大多数情况下您是对的 @DYZ 是的,我刚刚检查了我的 /tmp 文件夹,我已经完成了 delete=False 的文件在那里。我只是想问一下,这些文件是否会永远存在?另外,既然这回答了我的问题,而且我的问题现在看起来很傻,我应该留下它还是删除它还是接受@quant 的回答?

以上是关于为啥即使在关闭临时文件后我也能够写入和读取它?的主要内容,如果未能解决你的问题,请参考以下文章

从 s3 获取数据并写入文件后无法从文件中读取数据

执行之间的常量数据

Oracle 存储过程 - 创建游标后我可以清空临时表吗

为啥不使用开发配置而不是临时配置?

退出并加载我的应用程序时,如何将图像保存并读取到临时文件夹

没有临时文件的两个程序的差异输出