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

Вот пример форматирования экзаменационных вопросов, найденный в текстовом файле:

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, лямбда, нелокальный, 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)

Это вообще не делает того, что должно. В основном я пытался посмотреть, смогу ли я просто успешно извлечь тип вопроса и присвоить его переменной questions_type. Однако вопрос_тип продолжал представлять собой список ['', 'Несколько\n'], и я не был уверен, как это исправить.

1
Kaia 30 Окт 2023 в 06:29
У вас недостаточно информации для обработки содержимого файла. Например... как выглядит вопрос, не множественный выбор? Также неясно, какого результата вы пытаетесь достичь.
 – 
Codist
30 Окт 2023 в 08:36

2 ответа

Метод 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
lucs100 30 Окт 2023 в 07:38

Попробуйте это.

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)

Я добавил комментарии к коду, чтобы вы поняли, что происходит. Удачи! :)

0
Tsubasa 30 Окт 2023 в 08:45