Python工具/包,从文本fi的问题和答案选项生成测验

2024-05-02 23:38:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,其中有30个选择题在下面的模式

  1. 第一个问题在这里?你知道吗

    A.方案1

    B.方案2

    C.方案3

    D.选项4

以此类推到30岁

选项的数量是可变的;至少有两个选项,最多有六个选项。你知道吗

我想在html/php测验这样的界面上练习这些问题,它允许我选择选项并最终显示结果。你知道吗

我试着用python阅读这个文件,然后尝试将问题和答案存储在单独的列表中,但没有成功。 下面是我的代码:

#to prevent IndexError 
question = ['','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','']
answers = ['','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','']
qOrA = "q"
mcq_file = "mcqs.txt"
mcq = open(mcq_file, "r")
data_list = mcq.readlines()

for i in range(len(data_list)):
    element = list(data_list[i])
    if element[0] == "A" and element[1] == ".":
        qOrA = "a"

    if qOrA == "q":
        question[i] = question[i]+ " " + data_list[i]

    elif qOrA == "a":
        answers[i] = answers[i]+ " " + data_list[i]

你知道吗mcq.readlines文件()问题3的结果如下 注意:实际上有多个换行符,因此文件结构不正确。你知道吗

['\n', '1.\n', '\n', ' \n', '\n', 'Which computer component contains all the \n', '\n', 'circuitry necessary for all components or \n', '\n', 'devices to communicate with each other?\n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', 'A. Motherboard\n', '\n', ' \n', '\n', ' \n', '\n', 'B. Hard Drive\n', '\n', ' \n', '\n', ' \n', '\n', 'C. Expansion Bus\n', '\n', ' \n', '\n', ' \n', '\n', 'D. Adapter Card\n', '\n', ' \n', '\n', ' \n', '\n', '\n', '\n', '\n', '2. \n', '\n', 'Which case type is typically \n', '\n', 'used for servers?\n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', 'A.\n', '\n', ' \n', '\n', ' \n', '\n', 'Mini Tower\n', '\n', ' \n', '\n', ' \n', '\n', 'B.\n', '\n', ' \n', '\n', ' \n', '\n', 'Mid Tower\n', '\n', ' \n', '\n', ' \n', '\n', 'C.\n', '\n', ' \n', '\n', ' \n', '\n', 'Full Tower\n', '\n', ' \n', '\n', ' \n', '\n', 'D.\n', '\n', ' \n', '\n', ' \n', '\n', 'desktop\n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', '\n', '\n', '\n', '3.\n', '\n', ' \n', '\n', 'What is the most reliable way for users to buy the \n', '\n', 'correct RAM to upgrade a computer?\n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', 'A.\n', '\n', ' \n', '\n', ' \n', '\n', 'Buy RAM that is the same color as the memory sockets \n', '\n', 'on the motherboard.\n', '\n', ' \n', '\n', ' \n', '\n', 'B.\n', '\n', ' \n', '\n', ' \n', '\n', 'Ensure that the RAM chip is the same size as the ROM chip.\n', '\n', ' \n', '\n', ' \n', '\n', 'C.\n', '\n', ' \n', '\n', ' \n', '\n', 'Ensure that the RAM is \n', '\n', 'compatible\n', '\n', ' \n', '\n', 'with the peripherals \n', '\n', 'installed on the motherboard.\n', '\n', ' \n', '\n', ' \n', '\n', 'D.\n', '\n', ' \n', '\n', ' \n', '\n', 'Check the motherboard manual or manufacturer’s website.\n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', ' \n', '\n', '\n', '\n', '\n']

Tags: 文件thetofordatais选项方案
2条回答

您可以尝试:

question =[]
mcq = open(mcq_file, "r")
data_list = mcq.readlines()  
for data in data_list:
    data = data.strip() #removes white space
    first_part = data.split(".")[0] 
    if first_part.isnumeric():
        # This is question and you can append this in question list
        question.append(data)

希望这是你想要的。有些小错误是因为mcqs.txt文件不可预测的不一致。例如,在问题5中,答案出现了错误。当我们选择容纳问题26的小写答案选择时,我们就把一个邪恶换成另一个邪恶,这就是为什么问题3的答案选择看起来很奇怪(“网站”和“主板”。以“e”和“d”结尾)。同样,问题25写在2\n 5。这就是为什么输出中偶尔会有单独的单词串联在一起。我很想知道原始文件是什么格式的,为什么它会被弄坏?这些是错别字还是你从PDF或其他文件粘贴的?你知道吗

#Get text into workable format
txt=open(r"mcqs.txt","r").readlines()
txt=[line.replace("\n"," ") for line in txt]
txt=[line for line in txt if len(line)>0]
txt=[line.encode('ascii','ignore').decode("utf-8") for line in txt]
txt=[line.strip() for line in txt if line!=" " and line!=""]
txt1="".join(txt)     
#Initialize Separator lists
full_test,q_list,let_list=dict(),[str(i)+"." for i in range(1,31)],["A","B","C","D","E","F"]
def segment(txt1,list_of_separators):
    #Returns list of tuples
    #Tuples define start and end index of separator
    i,j,ints,ends=0,0,[],[]
    while j<len(list_of_separators):
        sep=list_of_separators[j]
        if sep in txt1[i:i+len(sep)+1] or sep.lower() in txt1[i:i+len(sep)+1]:
            index=i+len(sep)
            if txt1[i+len(sep)]==".": index=index+1
            ints.append(index)
            ends.append(len(sep))
            j=j+1
        if i==len(txt1):
            break
        i=i+1
    ints=ints+[len(txt1)+ends[-1]]
    tups = [(ints[k],ints[k+1]-ends[k]) for k in range(len(ints)-1)]
    return tups
#Segment based on question number
tups=segment(txt1,q_list)
#Get blocks of text (includes question and answer choices)
blocks,n=[txt1[tup[0]:tup[1]].strip() for tup in tups],1
for block in blocks:
    #Segment based on answer choice
    tups=segment(block,[str(i)+"." for i in let_list])
    tups=[(0,tups[0][0]-2)]+tups
    choices=[block[tup[0]:tup[1]].strip() for tup in tups]
    #Initialize dictionary
    full_test[n]={"Question":choices[0]}
    m=0
    for choice in choices[1:]:
        full_test[n].update({let_list[m]+".":choice})
        m=m+1
    n=n+1
#Prompt user for answer as if actually test
for question in full_test.keys():
    print(str(question)+"."+full_test[question]["Question"]+"\n")
    ind=0
    for choice in full_test[question].items():
        if ind==0:
            ind=ind+1
            continue
        else:
            print(choice[0]+" "+choice[1])
    answer=input("\nAnswer:")
    full_test[question].update({"Answer":answer})

如果我对这个挑战没有感觉的话,我会修正格式上的小不一致,并且可能会想出更简单的方法。但有什么好玩的。。。你知道吗

相关问题 更多 >