程序介绍 

假如你是一位老师,班上有 50名学生,你希望进行一个小测验,测试的内容为国内各省的简称,不妙的是,班里有几个调皮捣蛋的,你无法确信学生会不会作弊。你希望随机调整问题的次序,这样每份试卷都是独一无二的,这让任何人都不能从其他人那里抄袭答案。下面我们就用Python解决这个问题

编写步骤  

根据上面的需求,我们拆分出程序要做的事:

Ø创建50份不同的测验试卷。

Ø为每份试卷创建34个选择题,次序随机。

Ø为每个问题提供一个正确答案和3个随机的错误答案,次序随机。

Ø将测验试卷写到50个文本文件中。

Ø将答案写到50个文本文件中。

下面我们一步一步用代码实现

1、生成测试数据并保存在一个字典里面

         

用Python批量生成试卷文件_代码实现

2、生成试卷和答案文件

用Python批量生成试卷文件_代码实现_02

我们这边首先定义一个保存文件的文件夹“results”,然后判断该文件夹是否存在,如果不存在就创建该文件夹。

然后创建一个50次的循环,在循环体内生成试卷文件,给每个文件名加一个序号,让每个文件名不一样,之后创建答案文件,同样给每个文件名加一个序号。并将各省的名字放入一个列表province中。

在循环体内再创建一个34次的循环生成34个试题,先找出正确的答案,然后在34个各省简称中将正确答案去掉,放入一个列表中,再从中选择三个错误答案,之后将一个正确答案和三个错误答案放入一个列表中,然后利用random.shuffle函数生成随机的列表。

用Python批量生成试卷文件_代码实现_03

再在34次循环体内新建一个4次的循环,生成每个问题的4个选项,之后生成答案文件里面写入问题的正确答案。

程序代码  

import random
from os import makedirs
from os.path import exists

RESULTS_DIR = 'results'
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)
provinces = {'北京':'京','天津':'津','黑龙江省':'黑','吉林省':'吉','辽宁省':'辽',
            '内蒙古自治区':'内蒙古','河北省':'冀','山东省':'鲁','山西省':'晋','河南省':'豫',
            '江苏省':'苏','安徽省':'皖','湖北省':'鄂','湖南省':'湘','江西省':'赣',
            '浙江省':'浙','上海':'沪','福建省':'闽','台湾省':'台','广东省':'粤','广西壮族自治区':'桂',
            '海南省':'琼','香港':'港','澳门':'澳','贵州省':'黔','云南省':'滇','四川省':'川','重庆':'渝',
            '西藏':'藏','新疆':'新','青海省':'青','甘肃省':'甘','宁夏':'宁','陕西省':'陕'}

for quizNum in range(50):
    quizFile = open(f'{RESULTS_DIR}/capitalsquiz%s.txt' % (quizNum + 1), 'w',encoding='utf-8')
    answerKeyFile = open(f'{RESULTS_DIR}/capitalsquiz_answers%s.txt' % (quizNum + 1), 'w',
                         encoding='utf-8')
    quizFile.write('姓名:\n\n日期:\n\n班级:\n\n')
    quizFile.write((' ' * 20) + '34个省会简称测试 (卷 %s)\n' % (quizNum + 1))
    province = list(provinces.keys())
    random.shuffle(province)

    for questionNum in range(34):
        correctAnswer = provinces[province[questionNum]]
        wrongAnswers = list(provinces.values())
        wrongAnswers.remove(correctAnswer)
        wrongAnswers = random.sample(wrongAnswers, 3)
        answerOptions = wrongAnswers + [correctAnswer]
        random.shuffle(answerOptions)
        quizFile.write('%s. %s 的简称是什么?\n' % (questionNum + 1, province[questionNum]))
        for i in range(4):
            quizFile.write(' %s. %s\n' % ('ABCD'[i], answerOptions[i]))
        quizFile.write('\n')
        answerKeyFile.write('%s. %s\n' % (questionNum + 1,
                                          'ABCD'[answerOptions.index(correctAnswer)]))
    quizFile.close()
    answerKeyFile.close()