word题库特征:
有判断、单选和多选,有答案和解析,行数长度不一,并且并非一题的解析仅占一行,有时占多行。
好处:每题都有序号,如'1.'、'2.'……'234.'……等等。选择都有 'A.' 'B.' 'C.' 'D.'。答案都标注了"答案"。解析虽然也标注了“解析”,但有些解析是分好几行的。
见代码:
import os
import openpyxl as px
wb = px.Workbook()
ws = wb.active
i = 0
m = 0
path = "/home/oliveryty/下载"
f = open("/home/oliveryty/下载/fl知识竞赛试题库.txt", "r")
for line in f.readlines():
line = line.replace(" ", "").replace("\n", "")
#m = i & 5 +1 #这个余数分列法,不适用于行数不规律的情况
i = i+1
if "判断题" in line or "单选题" in line or "多选题" in line:
ws.cell(i, 1).value = line
tx = line #题型行时记下这部分的题型
elif '1.' in line or '2.' in line or '3.' in line or \
'4.' in line or '5.' in line or '6.' in line or '7.' in line or \
'8.' in line or '9.' in line or '0.' in line:
ws.cell(i, 2).value = line
ws.cell(i, 1).value = tx #每行题干都把前面记下的题型填入
m = i #如果i遍历到了题干一行,就让m等于i,意思就是让后面的都跟题干保持为一行。
elif 'A.' in line:
ws.cell(m, 3).value = line
elif "B." in line:
ws.cell(m, 4).value = line
elif "C." in line:
ws.cell(m, 5).value = line
elif "D." in line:
ws.cell(m, 6).value = line
elif "答案" in line:
ws.cell(m, 7).value = line
else: #到了解析的处理了
m = m+1 #m也遍历起来
#print(ws.cell(m-1, 8).value)
if m-1 != 0 and ws.cell(m-1, 8).value == None: #如果题干行的解析列为空,直接填
ws.cell(m-1, 8).value = line
elif m-1 != 0 and ws.cell(m-1, 8).value != None:
ws.cell(m-1, 8).value = ws.cell(m-1, 8).value + line
#如果解析列为多行,题干行解析列已填入了一行,后续的就跟前面字符串拼接了以后再填入。
else:
ws.cell(i, 8).value = line
wb.save(path + "/fl竞赛.xlsx")