Краткое объяснение
Поскольку ваше
while True
l oop никогда не заканчивает ваши изменения в файле никогда не будут фактически "зафиксированы".
Длинное объяснение
Причина, по которой мы используем
with open(filename, 'a') as f:
f.write("write something")
вместо
f= open("myfile.txt","w+")
f.write("write something")
f.close()
, заключается в том, что нам не нужно закрывать доступ к файлу вручную - только после "f.close ()" изменения фактически записываются в локальный файл!
В вашем коде close () вызывается за кулисами, когда заканчивается ваш «with» -блок:
with open(filename, 'a') as f:
while True:
name = input('enter name ')
f.write(name + '\n')
print(f"You have been added to the guest book, {name}")
# close() would be triggered behind the scenes here
# only after completing ALL statements in your with-block, the changes get saved to the file.
print("We never reach this point...")
Поскольку ваш код никогда не достигает этой точки, поскольку у вас есть «true», в то время как true l oop ", файл никогда не закрывается и изменения никогда не записываются в файл.
Во втором примере кода файл открывается и закрывается на каждой итерации« while true »-l oop поскольку ваш блок with начинается и заканчивается в одной итерации l oop. Это означает, что все изменения фиксируются на каждой итерации l oop.
Редактировать :
Как указал MisterMiyagi :
"f.close () освобождает дескриптор файла. Он также вызывает (внутренний эквивалент) f.flu sh () для фиксации ожидающих изменений. Однако основная цель - освободить дескриптор файла. «
Таким образом, вы можете либо закрыть весь файл (так как Python автоматически сбрасывает файлы при закрытии), либо вызвать« f.flu sh () »в вашем while-l oop после запись в flu sh внутреннего буфера, но для сохранения дескриптора файла на случай, если вы захотите продолжить запись позже.
Итак, вот рабочая адаптация вашего первого кода (с flu sh) :
filename = 'guest_book'
with open(filename, 'a') as f:
while True:
name = input('enter name ')
f.write(name + '\n')
f.flush() # making sure the changes are in the file.
print(f"You have been added to the guest book, {name}")