Есть ли простой способ добавить новые строки в отдельные элементы списка в Python?

#python #list #newline

Вопрос:

Я создаю проект викторины для школы с использованием Python, и в качестве его части я должен хранить вопросы и ответы во внешнем файле. В настоящее время вопросы и их ответы находятся в одной строке текстового документа, из которого они получены, например;

  1. Что означает процессор?na) Центральный блок программированияnb) Центральный процессорnc) Блок процесса охлажденияnd) Блок компьютерной обработки

Однако, когда он напечатан, n он не работает и выглядит точно так, как я отформатировал его выше. Есть ли простой способ разместить ответы в отдельных строках, сохраняя при этом вопрос и все четыре ответа в одном элементе списка? Вся функциональность проекта в порядке, эта визуальная ошибка-единственная проблема.

Если это поможет, вот несколько упрощенная часть рассматриваемого кода:

 
questions_answers = open("qamp;a.txt", "r")

class Question:
    def __init__(self, question, answer):
        self.question = question
        self.answer = answer


line_of_questions = [1, 2, 3, 4, 5]
for position, line in enumerate(questions_answers):
    if position in line_of_questions:
        question_prompts.append(line)

questions = [
    Question(question_prompts[0], "b"),
    Question(question_prompts[1], "a"),
    Question(question_prompts[2], "c"),
    Question(question_prompts[3], "a"),
    Question(question_prompts[4], "d")
]

def Start_Quiz(questions):
    score = 0
    for question in questions:
        answer = input(question.question)
        if answer == question.answer:
            score  = 1


Start_Quiz(questions)
 

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

1. Где код, который печатается?

2. ответ = ввод(вопрос. вопрос)

3. Я знаю, что смысл в том, чтобы оно было в скобках после функции ввода, чтобы оно отображалось пользователю, а затем позволяло ему вводить данные. Это работает точно так же, как, скажем, ввод(«Пожалуйста, введите свое имя»).

Ответ №1:

TLDR:

Допустим question , это строка, которую вы хотите напечатать. Вы можете сделать следующее, чтобы он отображался в нужном вам виде:

 import codecs
unescaped_question = codecs.escape_decode(bytes(question, "utf-8"))[0].decode("utf-8")
print(unescaped_question)
 

А теперь позвольте мне объяснить подробнее…

Рассмотрим обычный строковый объект в python str("QuestionnAnswer") . Если вы распечатаете его либо в терминале, либо в файле, он, естественно, будет отформатирован в:

 Question
Answer
 

Вы должны пройти «дополнительную длину», чтобы избежать строки, сделав ее str("Question\nAnswer") такой, чтобы она выглядела как

  QuestionnAnswer 
 

в текстовом файле. Вот почему, когда вы прочтете его из файла и распечатаете снова, вы не получите «Вопрос» и «Ответ» отдельно.

Интуитивно это имеет смысл, потому что, если вы прочитаете строку из файла и немедленно распечатаете ее обратно, никаких изменений не должно произойти. К сожалению, это также означает, что ваш текстовый файл в формате pre-printf нуждается в дальнейшей обработке…

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

1. Спасибо вам за это, куда бы я это поместил в своем коде? Нужно ли мне вносить какие-либо изменения для работы с именами моих переменных? Я все еще новичок в Python, как вы, вероятно, можете сказать, так что спасибо вам за помощь

2. Я предполагаю, что вы читаете строку из файлового объекта , скажем f , с помощью question = f.readline() . Тогда вам просто нужно: unescaped_question = codecs.escape_decode(bytes(question, "utf-8"))[0].decode("utf-8") print(unescaped_question) Также добавьте» импорт кодеков » в верхнюю часть вашего файла

3. Извините за беспокойство, но я все еще не понимаю, строка отображается с помощью ответа = ввод(вопрос. вопрос) строка, я не могу заставить ее работать, даже когда пытаюсь создать новый сценарий, более похожий на ваши предположения

4. Подсказка: я использую print() для печати. И вы используете input() для печати. Не имеет значения, что используется для печати, но то, что печатается, является ключом. В моем примере печатный контент называется unescaped_question . Для создания содержимого требуется исходное чтение из файла под названием question . В вашем случае question эквивалентность равна question.question

5. Я лег спать после того, как пытался заставить его работать около часа прошлой ночью, и я только что проснулся сегодня утром и сумел заставить его работать в течение нескольких минут, большое вам спасибо! 🙂

Ответ №2:

Если я правильно понимаю, вы должны распечатать строки, прежде чем запрашивать ввод

 for question in questions:
    for line in question.question.split('\n'):
        print(line)
    answer = input()
 

В противном случае, вместо разделения, я предлагаю хранить ваши данные в лучшем формате файла, например, в формате JSON, а затем вы можете проанализировать его и просмотреть список опций

 { 
  "questions": [{
    "prompt": "What is a CPU",
    "options": [
      "A) Central ...",
      "B) Cooling ..."
    ],
    "answer": "A"
  }]
}
 

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

1. Спасибо за ответ, я попытался заставить это работать, но я просто получаю ошибку; Ошибка атрибута: объект «Вопрос» не имеет атрибута «разделение»

2. Извините, забыл, что это был список объектов

3. Я понятия не имею, как использовать JSON, но я постараюсь разобраться в этом, спасибо