Для части моего задания по программированию мне нужно написать код, который принимает имя текстового файла в качестве аргумента командной строки, считывает детали специально отформатированных экзаменационных вопросов из текстового файла и определяет его различные функции. Мне это нужно, чтобы программа могла продолжить работу и позволить пользователю сдать экзамен и ответить на вопросы.
Вот пример форматирования экзаменационных вопросов, найденный в текстовом файле:
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'], и я не был уверен, как это исправить.
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)
Вы можете извлечь тип вопроса в одну строку — это оставлено в качестве упражнения для читателя.
Попробуйте это.
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)
Я добавил комментарии к коду, чтобы вы поняли, что происходит. Удачи! :)
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.