Почему я могу писать и читать временный файл даже после его закрытия?
Я экспериментировал с открытием текстовых редакторов из моего скрипта на python и заметил кое-что, что явно противоречит моему пониманию документации tempfile.
Мой эксперимент начался с ответа Алекса Мартелли.
Мой код -
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
выполняет. И как временный файл, файл не виден в каталоге, где я открыл терминал и запустил скрипт. Что еще более странно, так это 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 ответ
Давайте посмотрим на ваш код глубже.
Сначала вы создаете временный файл
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