Python - чтение и запись ввода от пользователя - PullRequest
0 голосов
/ 23 ноября 2011

У меня проблемы с написанием этой короткой программы для моего класса Python. Я надеялся, что кто-нибудь может предложить какую-то помощь.

Чего я хотел бы достичь: 1. Напишите программу, которая использует цикл while для приема ввода от пользователя (если пользователь нажимает Enter, выйдите из программы). 2. Сохраните ввод в файл, затем распечатайте его. 3. После запуска программа отобразит текущее содержимое файла.

Пример:

Запустить программу в первый раз.

Введите текст: это ввод

это ввод.

Введите текст: еще немного текста

это ввод. еще немного текста.

При повторном запуске программы

это ввод. еще немного текста.

Введите текст:

и т.д.. и т.д.

Что у меня пока что:

intext = open('user_input.txt','a')
intext.close()
string_input = input('Enter text: ')
while True:
    open_input = open('user_input.txt','r')
    if open_input:
        for i in open_input:
            print(i)

    if string_input != "":
        uinput = open('user_input.txt','a')
        uinput.write(string_input + '.')
        uinput.close()
        rd = open('user_input.txt', 'r')
        if rd:
            for line in rd:
                print(line)

    if string_input == "":
        t = open('user_input.txt', 'r')
        for line in t:
            print(line)
        t.close()
        break

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

Позитивы: входные данные записываются в текстовый файл. Если текст не введен, при выходе любой ранее введенный текст отображается правильно.

Как я уже сказал, это домашнее задание для меня. Я искал ответ, но я, кажется, разрывал код на части и собирал его вместе, чтобы получить разные ошибки. Так что некоторые рекомендации по этому вопросу будут с благодарностью.

Одна вещь, которую я забыл упомянуть, это то, что я использую Python 3.


Еще раз спасибо Дэвиду за то, что он помог мне думать больше как программист. Вот результаты:

intext = open('user_input.txt','r').readline()
print(intext)
while True:
    string_input = input('Enter text: ')
    if string_input == "":
        t = open('user_input.txt', 'r').readline()
        print(t)
        break
    if string_input != "":
        d = open('user_input.txt', 'a')
        d.write(string_input + '. ')
        d.close()
        n = open('user_input.txt', 'r').readline()
        print(n)

Я пытался сделать код максимально тонким, и теперь он работает.

Пара вопросов дополнительные вопросы, которые возникли из этого:

  1. Нужно ли закрывать файл в конце? Когда я пытался закрыть apnd и n, это дало мне ошибки.

  2. При поиске ответов наткнулся, на это . По-прежнему ли лучше использовать оператор with?

* * Пример тысяча шестьдесят три:
with open("x.txt") as f:
    data = f.read()
    do something with data

Ответы [ 2 ]

5 голосов
/ 23 ноября 2011

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

В вашем вопросе вы перечислили следующие шаги:

  1. При запуске отобразите любое предыдущее содержимое файла
  2. Используйте цикл while для
    1. Принять ввод от пользователя
    2. Если пользователь нажмет Enter, выйдите из программы
    3. Сохраните ввод в файл
    4. Распечатайте его ( 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

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

0 голосов
/ 23 ноября 2011

Используйте raw_input вместо ввода.

Вы забыли вызвать вход в цикле while

Кстати, почему бы не записывать данные только при выходе из программы, а не в каждом цикле?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...