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