пока l oop и открытие файла в режиме добавления. почему порядок имеет значение? - PullRequest
1 голос
/ 06 апреля 2020

Я иду по курсу 'python cra sh', один из практических вопросов просит меня открыть / создать текстовый файл 'guest_book' в режиме добавления и создать некоторое время l oop, чтобы запросить ввод пользователя их имя, одновременно добавьте их имя в текст 'guest_book' и напечатайте, что они были зарегистрированы. Я написал следующий код.

filename = 'guest_book'

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}")

Проблема: пока l oop успешен, и окончательная печать также успешна, однако, когда я проверяю txt guest_book. он не записывает введенное имя. Интересно, что при простом переключении порядка while и l oop и команды open txt это работает примерно так:

filename = 'guest_book.txt'   

while True:
    with open(filename, 'a') as f:
        name = input('enter name ')
        f.write(name + '\n')
        print(f"You have been added to the guest book, {name}")

единственная разница между двумя кодами - это переключаемая последовательность в то время как l oop и "с открытой" линией. Может кто-нибудь объяснить мне, почему этот порядок имеет значение? Как бы я ни старался, я не могу понять логику, стоящую за этим. Спасибо

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Краткое объяснение

Поскольку ваше

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}")
0 голосов
/ 06 апреля 2020

похоже, проблема в том, что противоположный текстовый файл не закрыт должным образом, программа завершается принудительно, не позволяя выполнить закрывающий код или что-то в этом роде. Причина, по которой работает:

filename = 'guest_book.txt'   

while True:
  with open(filename, 'a') as f:
    name = input('enter name ')
    f.write(name + '\n')
    print(f"You have been added to the guest book, {name}")

, заключается в том, что вы постоянно закрываете и закрываете файл.

Если вы хотите, чтобы файл закрывался, я рекомендую добавить функцию сохранения или функцию выхода. , Это заставит файл правильно закрыться и сохранится, вроде как:

filename = 'guest_book'

with open(filename, 'a') as f:
  while True:
    name = input('enter name ')
    if name == 'exit':
         break
    f.write(name + '\n')
    print(f"You have been added to the guest book, {name}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...