为什么即使关闭临时文件也能写入和读取临时文件?

时间:2018-11-11 06:34:19

标签: python python-3.x subprocess temporary-files nano

我正在尝试使用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

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

  

如果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)))

1 个答案:

答案 0 :(得分:3)

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

首先创建临时文件

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