提问人:Kaia 提问时间:10/30/2023 最后编辑:phoKaia 更新时间:10/30/2023 访问量:67
我将如何浏览文本文件并提取我需要的不同元素?
How would I go through a text file and pull out the different elements I need?
问:
对于我的部分编程任务,我需要编写代码,将文本文件名作为命令行参数,从文本文件中读取特定格式的考试问题的详细信息,并识别其不同功能。我需要它来做到这一点,以便程序可以继续允许用户参加考试并回答问题。
以下是在文本文件中找到的考试问题格式示例:
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'] 结束,我不确定如何解决它。
答:
该方法通过在每次出现 时拆分一个字符串来创建列表。在查询“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)
您可以在一行中提取问题类型 - 这是留给读者的练习。
试试这个。
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)
我已经对代码进行了注释,以使您了解正在发生的事情。祝你好运!:)
评论