有没有一种简单的方法可以将换行符添加到 Python 列表中的单个项目中?

Is there a simple way to add newlines into individual items in a list in Python?

我正在使用 Python 为学校制作一个测验项目,作为其中的一部分 我必须将问题和答案存储在外部文件中 。目前,问题和答案在接收它们的文本文档中位于同一行,例如;

  1. CPU代表什么?\na) 中央编程Unit\nb) 中央处理Unit\nc) 冷却处理Unit\nd) 计算机处理单元

然而,当它被打印出来时,\n 没有发挥作用,看起来和我上面格式化的一模一样。有没有一种简单的方法可以让答案分行 同时将问题和所有四个答案 保留在同一个列表项中?项目的整个功能都很好,这个视觉错误是唯一的问题。

如果有帮助,这里是相关代码的简化部分:


questions_answers = open("q&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)

如果我没理解错的话,你应该在要求输入之前打印这些行

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

TLDR:

假设 question 是您要打印的字符串。您可以执行以下操作以使其以您想要的方式显示:

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

现在,让我解释更多...

考虑 python str("Question\nAnswer") 中的普通字符串对象。如果您将它打印到终端或文件,它自然会格式化为:

Question
Answer

您必须“加长”以转义字符串,方法是使它 str("Question\nAnswer") 使其显示为

 Question\nAnswer 

在文本文件中。这就是为什么当您从文件中读回并再次打印时,您不会将“问题”和“答案”分开。

从直觉上讲,这是完全合理的,因为如果您从文件中读取一行并立即将其打印回来,应该不会发生任何更改。不幸的是,这也意味着您的预 printf 格式的文本文件需要进一步处理...