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