我将如何浏览文本文件并提取我需要的不同元素?

How would I go through a text file and pull out the different elements I need?

提问人:Kaia 提问时间:10/30/2023 最后编辑:phoKaia 更新时间:10/30/2023 访问量:67

问:

对于我的部分编程任务,我需要编写代码,将文本文件名作为命令行参数,从文本文件中读取特定格式的考试问题的详细信息,并识别其不同功能。我需要它来做到这一点,以便程序可以继续允许用户参加考试并回答问题。

以下是在文本文件中找到的考试问题格式示例:

Question - Multiple
Select all the animals that are mammals:
Possible Answers: 
A. whale
B. dog
C. fish
D. frog
Expected Answer: A, B
Marks: 2

我需要程序提取问题类型(即“多个”)、问题本身、所有可能的答案、预期答案以及正确回答的分数。

文本文件内部还有多个问题,用空行分隔。我不确定如何让程序将每个问题的细节彼此独立地分开。

我不允许使用以下任何关键字或内置函数:for、in (contains())、global、lambda、nonlocal、all()、any()、dir()、eval()、enumerate()、filter()、globals()、locals()、map()

我确实试图弄清楚这个问题很长一段时间,但我似乎无法理解它。这是我目前所拥有的,尽管我知道这是非常不正确的。但是,它可能会对我被允许使用的方法/功能提供某种见解,所以我想我会添加它。

import sys

filename = sys.argv[1]

fobj = open(filename, 'r')

read_lines = fobj.read()

print(read_lines)

while fobj != "":

    if "Question - " in read_lines:
        question_type = read_lines.split("Question - ")
    break

print(question_type)

这根本没有做它应该做的事情。我主要是想看看我是否可以成功提取问题类型并将其分配给question_type变量。但是,question_type一直以列表 ['', 'Multiple\n'] 结束,我不确定如何解决它。

python python-3.x

评论

0赞 Codist 10/30/2023
您没有足够的信息来处理文件内容。例如。。。不是多项选择题的问题是什么样的?目前还不清楚您要实现什么输出

答:

0赞 lucs100 10/30/2023 #1

该方法通过在每次出现 时拆分一个字符串来创建列表。在查询“Question - ”中拆分字符串“Question - Multiple”确实会给你得到的字符串列表 - 第一个条目是一个空字符串,第二个条目是字符串的其余部分。这是一个换行符,它可能位于您从文件中读入的每一行的末尾。你或多或少走在正确的轨道上。split(query)query'''Multiple\n'\n

从这里开始,由于在“问题 - ”处拆分将始终为您提供一个看起来像您得到的列表的列表,因此您可以通过获取列表中的第二个条目来获取问题类型。然后,您可以使用 删除多余的空格字符(包括换行符)。在您的代码中,这将如下所示:\n.strip()

if "Question - " in read_lines:
    result = read_lines.split("Question - ")
    question_type_raw = result[1]
    question_type = question_type_raw.strip()
    break

print(question_type)

您可以在一行中提取问题类型 - 这是留给读者的练习。

0赞 Tsubasa 10/30/2023 #2

试试这个。

import sys
from typing import Optional, TextIO, TypedDict

if len(sys.argv) != 2:
    print("Usage: python3 main.py <filename>")
    sys.exit(1)

filename = sys.argv[1]

ParsedObject = TypedDict("ParsedObject", {
    "type": str,
    "question": str,
    "options": list[str],
    "marks": int
})


def parse_question(f: TextIO) -> Optional[ParsedObject]:
    """
    Parses a question from a file.

    Args:
        f: TextIO: File to be parsed from.

    Returns:
        Parsed Object or None if no question was found.
    """
    line = f.readline()

    # If we have reached the end of file
    if line == "":
        return None
    # Get the question type
    q_type = line.strip().split("-")[1]

    # Get the question
    questions: list[str] = []
    for line in f:
        question: str = line.strip()
        # This means we have already read all the questions.
        # Break out of the loop
        if question == "Possible Answers:":
            break
        questions.append(question)

    # Read all the available options
    options: list[str] = []
    for line in f:
        l: str = line.strip()
        # Okay we have read all the options
        # Time for us to break out
        if l.startswith("Expected Answer:"):
            break
        # Get the option and append it.
        option = l.split(maxsplit=1)[1]
        options.append(option)

    # Get the marks
    marks: int = int(f.readline().strip().split(" ")[1])
    # Return the question in `ParsedObject` form
    return {
        "type": q_type,
        "question": "\n".join(questions),
        "options": options,
        "marks": marks
    }


try:
    with open(filename, 'r') as f:
        questions = []
        while True:
            question = parse_question(f)
            if not question:
                break
            questions.append(question)
            f.readline()

    print(questions)

except FileNotFoundError:
    print("File not found")
    sys.exit(1)

我已经对代码进行了注释,以使您了解正在发生的事情。祝你好运!:)