Проблемы с ‘with open’, для создания тривиальной задачи в python

#python #python-3.x

#python #python-3.x

Вопрос:

Я хотел бы создать тривиальную задачу! Но это работает не так, как я бы хотел. Это мой код :

 import os
with open('questions','r') as file:
   l = 0
   question = []
   right_guess = []
   wrong_guess_1 = []
   wrong_guess_2 = []
   for line in file:
        content_line = []
        for char in line:
             content_line.append(char)
        if l == 0:
             question.append(content_line)
             l = 1
        elif l == 1:
             right_guess.append(content_line)
             l = 2
        elif l == 2:
             wrong_guess_1.append(content_line)
             l = 3
        elif l == 3:
             wrong_guess_2.append(content_line)
             l = 4
   if l == 4:
        break
   print(question)
   print(right_guess)
   print(wrong_guess_1)
   print(wrong_guess_2)
   input('Awnser : ')
  

Хорошо, теперь давайте я объясню две проблемы. Я попробовал свой код с этой структурой файла вопроса (расширения нет, это просто ‘вопрос’) :

  a question
      the right anwser
      false guess
      false guess
 a other question
      the right anwser
      false guess
      false guess
  

вот пример, если вы не понимаете :

  How does 1   1 ?
  3
  0
  5
  

Очевидно, что ответ во второй строке: 3 ! ( шучу, это 2, я знаю : D )
Итак, давайте вернемся к нашей проблеме: я запустил код, и он выдал мне этот результат :

  [[ 'H', 'o', 'w', ' ', 'd', 'o', 'e', 's', ' ', '1', ' ', '1', ' ', '?', 'n']]
 [[ 'H', 'o', 'w', ' ', 'd', 'o', 'e', 's', ' ', '1', ' ', '1', ' ', '?', 'n']]
 [[ 'H', 'o', 'w', ' ', 'd', 'o', 'e', 's', ' ', '1', ' ', '1', ' ', '?', 'n']]
 [[ 'H', 'o', 'w', ' ', 'd', 'o', 'e', 's', ' ', '1', ' ', '1', ' ', '?', 'n']]
 Answer :
  

Я действительно не понимаю, в чем проблема, но я надеюсь, что кто-нибудь поможет мне получить этот результат :

  How does 1 1 ?
 2
 0
 5
 Answer
  

И если некоторые из людей, которые будут смотреть эту страницу, действительно сумасшедшие, я мог бы ожидать такого результата :

  (the program take one question, randomly, in the whole file)
 the chosen one
 one of the three possibles guests
 one other of the three possibles guests
 a third possible guest
 ( And we don't know which one is the correct )
 Answer :
  

Я думаю, это все, спасибо всем, кто попытается дать подсказку, элемент или кто внесет свой вклад в эту маленькую программу !

Комментарии:

1. может быть, посмотрите еще раз на количество знаков равенства в «if l = 4»

2. Пожалуйста, покажите фактический код. В этом коде есть по крайней мере три опечатки, которые вообще помешали бы его запуску; итак, как мы можем узнать, что вызывает вашу проблему?

3. Но также спросите себя, почему вы перебираете каждый символ в строке и добавляете его в список, если это не то, что вы хотите получить на выходе.

4. @trilarion, просто моя ошибка, потому что я переписал всю программу вручную ^^

5. К вашему сведению, слово «угадать», а не «гость». Гость — это посетитель.

Ответ №1:

Ваша первая проблема здесь:

 content_line = []
for char in line:
    content_line.append(char)
  

Ничего из этого не требуется. Просто используйте line для следующих нескольких строк:

 for line in file:
    if l == 0:
        question.append(line)
  

и т. д

Ответ №2:

Код в вопросе не выдает одну и ту же строку несколько раз в качестве выходных данных. Если это и было проблемой, то она не представлена в этом коде.


Причина, по которой вы получаете списки вместо строк в результате, заключается в том, что вы явно создаете эти списки:

         content_line = []
        for char in line:
             content_line.append(char)
  

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


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

Вместо добавления в списки, просто присваивайте переменным:

    for line in file:
        # Remove trailing whitespace at the end of the line
        content_line = line.rstrip()
        if l == 0:
             question = content_line
             l = 1
        elif l == 1:
             right_guess = content_line
             l = 2
        elif l == 2:
             wrong_guess_1 = content_line
             l = 3
        elif l == 3:
             wrong_guess_2 = content_line
             l = 4
  

Ответ №3:

Хорошо, похоже, это окончательный код :

 for line in file:
    # Remove trailing whitespace at the end of the line
    content_line = line.rstrip()
    if l == 0:
         question = content_line
         l = 1
    elif l == 1:
         right_guess = content_line
         l = 2
    elif l == 2:
         wrong_guess_1 = content_line
         l = 3
    elif l == 3:
         wrong_guess_2 = content_line
         l = 4
  

Спасибо quamrana, пользователю1018651 и всем, кто оставил комментарий, чтобы помочь мне!
В любом случае, это все еще «маленькая» вещь, которую нужно исправить, и я думаю, что это самое сложное :
Преобразуйте этот код для добавления случайных вопросов и получите, в конце, это :

   (the program take one question, randomly, in the whole file)
  the chosen one
  one of the three possibles guests
  one other of the three possibles guests
  a third possible guest
  ( And we don't know which one is the correct )
  Answer :