Честно говоря, ваша программа, как вы показали, является беспорядком.Я говорю, что это не оскорбительно, а потому, что у вас есть довольно четкий список шагов, которые ваша программа должна предпринять, и я думаю, что вы получите лучшее понимание, отбросив существующий код и начав с нуля.
В вашем вопросе вы перечислили следующие шаги:
- При запуске отобразите любое предыдущее содержимое файла
- Используйте цикл
while
для - Принять ввод от пользователя
- Если пользователь нажмет Enter, выйдите из программы
- Сохраните ввод в файл
- Распечатайте его ( note :Вы хотели напечатать только самый последний ввод или все в файле?)
Превращение вашей общей задачи в список конкретных шагов, подобных этому, составляет, вероятно, 80%работа по написанию компьютерной программы.Все, что осталось сделать, это перевести его в код.Поэтому я бы посоветовал вам подумать о том, как выполнить каждый из этих шагов в отдельности.
- Написать фрагмент кода для отображения содержимого файла
- Создать фрагмент кода для чтения строкиввода от пользователя и сохраните его в переменной
- Напишите фрагмент кода, чтобы проверить содержимое переменной, чтобы увидеть, является ли он пустым, и если это так, выйдите из
- Записать фрагмент кода вдобавить содержимое переменной в файл
- Написать фрагмент кода для печати содержимого переменной (или файла, если это то, что вы хотели сделать)
Каждыйиз них можно сделать одну или две строки, поэтому по отдельности вам будет легко с ними справиться.После того, как вы сделали все части, все, что вам нужно сделать, это собрать их вместе:
# display the contents of the file
while True:
# read a line of input and store it in a variable
# check the contents of the variable to see if it's empty, and if so, exit
# append the contents of the variable to the file
# print the contents of the variable (or of the file)
Обновление: Это не имеет большого значения, но у вас естьненужное утверждение if
(второе) в вашей исправленной программе.Подумайте об этом: если string_input
пусто, Python выполнит оператор break
, который немедленно завершит цикл.Таким образом, вы когда-либо достигнете второй оператор if
, только если string_input
не пуст.Это означает, что условие string_input != ""
гарантированно будет истинным в этой точке программы, и нет необходимости проверять его.
Нужно ли закрывать файл в конце?Когда я пытался закрыть apnd
и n
, это дало мне ошибки.
Да, вы делаете.Посмотрите на шаблон, который вы использовали с d
:
# open the file
d = open('user_input.txt', 'a')
# write to it (or read from it)
d.write(string_input + '. ')
# close it
d.close()
Вы должны делать то же самое при каждом открытии файла, а именно с intext
, t
и n
: открыть егопрочитайте его, а затем немедленно закройте. *
Я предполагаю, что причина, по которой вы столкнулись с ошибками, заключается в том, что вы пытались поместить операторы .close()
в конецпрограмма вне оператора if
и, возможно, даже вне цикла while
.Это даст вам NameError
, потому что переменные n
и t
не определены в этих точках программы.Они «истекают» в конце блока, в котором они определены. Для получения дополнительной информации об этом, прочитайте scoping .(Статья в Википедии, вероятно, не является введением best , но вы можете искать переполнение стека и / или в Интернете для получения дополнительных ресурсов.)
При поиске ответов я наткнулся это .По-прежнему ли лучше использовать оператор «с»?
Да, оператор with
является относительно новым для Python и является рекомендуемым способом выполнения «быстрых» операций ввода-вывода файлов, таких какэтот.В основном блок with
заботится о закрытии файла в конце.Например, приведенный выше фрагмент кода с d
эквивалентен
# open the file
with open('user_input.txt', 'a') as d:
# write to it (or read from it)
d.write(string_input + '. ')
# Python "automatically" closes it for you
* Этот шаблон доступа к файлу "открывать, читать, писать, закрывать" является обычно хорошей идеей. Я сказал вам использовать его в вашей программе, потому что для вас важно научиться разбивать программу на маленькие шаги и конвертировать каждый из шагов в код по отдельности. Но когда вы пишете программу, которая многократно записывает данные в файл или считывает их из файла, иногда на самом деле лучше просто открыть файл один раз в начале и просто оставить его открытым, а не открывать и закрывать его. каждый раз. Если вам интересно, одна вещь, которую вы можете исследовать, - это как изменить вашу программу, чтобы уменьшить количество раз, когда она должна открывать и закрывать файл.