用python将excel题库导入app用的TXT格式
一、转换需求的产生
上级发了一份excel题库进行抽考。为了方便刷题,将它转录进手机用的考试酷app。在移动端用app复习比用电脑复习方便多了。
题目数量比较多,因此考虑用python将其生成app题库录入工具需要的格式txt。
首先excel的题库是长这样子的
转成TxT样式是这样子
每题格式为:
1、序号为数字+英文逗号
2、列出问题
3、选项是大写英文字母+英文逗号开头。每个选项是单独一行的。
4、参考答案是冒号加内容。
其实并不复杂。主要涉及excel读取和写入TXT文档
并且需要处理一下题库本省杂乱的格式。
1、选项是大写英文字母+英文逗号开头,每个选项是单独一行的。而题库里所有的选项都挤成一行,需要处理一下。并且句号有中英文夹杂,必须得统一成英文的句号。
因为有好几百道题目,一个个复制来复制去很累。
二、Excel读取
因为涉及excel读取,在这里使用openpyxl模块。
1、导入openpyxl模块
import openpyxl
2、读取excel文件.xlsx。即表格簿。
wb=openpyxl.load_workbook('tiku.xlsx')
用load_workbook读取excel文件。
3、读取excel里标签页。
sheet=wb.get_sheet_by_name('多选题(60道)')
4、读取标签页里表格内容,例如读取A1表格的值
Tmp=sheet[‘A1’].value。
三、读取内容
因为题库数量较多,用了个循环读取。If循环。
先建立列表,作为读取出来的内容,循环读取过程中直接用列表的.append函数加到最后。
表格内容读取因为最后写到TXT里,涉及到int 到 str的转换,用str()函数。
四、文字处理及正则表达式
(一)、选项分离;
其中到了选项读取部分,就需要处理选项分行和中英文句号问题了。在这里采用了正则表达式来处理,方便简单。
样例文本如下:
需要变成的格式如下:
1、采用正则表达式,需要导入re模块。
import re
2、建立样例,文字匹配及替换
patter1='([A-E]).'
tmp=re.sub(patter1,'\\1.', tmp)
将选项里A.变为A.。注意中英文句号.的宽度。其中用了\1这个组,可以将匹配到的组复制会新的文本里。
并且注意在这里我用的是\\1,用了转移符\,将\1变成组1。
想理解并练习正则表达式替换效果的话,请访问https://regexr.com/,记得勾选右上角PCRE选项(Perl兼容正则表达式)才能使用\1。
3、将ABCDE自动换行,在字母前加入换行符\n。
patter2='([B-E]).'#将选项B.到E.自动换行
newstr=re.sub(patter2, '\n\\1.', tmp)
4、与别的字符处理语句对比
本来开始时候打算用以下语句进行换行,对比了一下太丑陋了。还是正则表达式简洁。
(二)、格式整理,删空行和段前段后空格;
列表生成之后,发现字符串里还有很多空行和分隔符、段前段后空格符等等。需要清理理一下。下面是需要整理的文本字符串样式。
需要整理完成的样式
还是用正则表达式。为了方便以后调用,直接写成函数形式。
1、匹配空行,用pat2=r'^\s$'#空行。开头符号^和结束符$之间只有\n、空格等。注意需要flags=re.M(多行模式)。
注意,因为re默认不是多行模式,使用^$作为每行的开头和结尾需要多行模式,而且必须加上flags明示。因为少写了flags,网上样例都没写这个,让我折腾了大半小时都没成功。后面翻了python原文档后才发现得写。真是坑爹。
2、匹配段前空格。pat3=r'^ '#段前空格,即开头符号^接上空格。注意需要flags=re.M(多行模式)
3、匹配段后空格。pat4=r' $'#段后空格。即空格接上结束符$。注意需要flags=re.M(多行模式)
五、写入txt。
fp=open('单选题题目及答案.txt','w',encoding='utf-8')
因为采用(utf-8编码),需指明,否则会出现错误“'gbk' codec can't encodecharacter”。
fp.writelines(quizs);
因为读取成列表形式,写入文档中,用writelines()函数,如果是用write()函数的话,需要写一个循环写入的。
程序代码部分
领取专属 10元无门槛券
私享最新 技术干货