Почему я могу писать и читать временный файл даже после его закрытия? - PullRequest
0 голосов
/ 11 ноября 2018

Я экспериментировал с открытием текстовых редакторов из своего скрипта на python и заметил кое-что, что явно противоречит моему пониманию документации tempfile .

Мой эксперимент начался с * 1005 Алекса Мартелли* 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 голосов
/ 11 ноября 2018

Давайте посмотрим на ваш код глубже.

Сначала вы создаете временный файл

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
...