没有过滤的效果 可以看见明显空值
strip 和正则切割后的效果
if row_list[1:]:#判断切割后的列表的第一个元素,是否有值 Ture 为题目 False 为答案选项if start_flag: # 判断是否为第一行content_list += row_list[1:] # 如果是第一行就题目添加进空列表 content_liststart_flag = False # 重制 start_flag 为 Falseelse: # 如果不是第一行content_list += answer #把 answer 答案列表添加进 content_listcontent_list.insert(0,number) # content_list 列表里第一个位置插入序号ws.append(content_list) # 把 content_list 列表写入 Excel 里number += 1 #更新下一题的序号content_list=[] # 重置 content_list 列表为空,准备添加下一题content_list += row_list[1:] # 把题目添加进空列表 content_listelse:# 这里利用 python 的切片机制 row_list 里只有一个元素时 row_list[1:]切片会返回row_list = [i.strip() for i in re.split(r'\s{4}',row_list[0]) if i ]# 处理一行 2 答案选项的情况content_list += row_list # 把 ABCD 选项文本添加进 content_list
超过列表长度的切片方法会返回空列表
处理一行 2 个答案选项的效果
if row_list[1:] 超过列表长度的切片方法会返回空列表 不会抛出异常
for run in content.runs: #遍历每个段落的文本样式 找的为红色的答案answer_color = str(run.font.color.rgb) # 获取每个段落的字体颜色if answer_color == 'FF0000' : # 判断此段落的文字是否为红色answer = re.findall(r'[A-D]{1}',run.text)#提取答案项对应的字母break # 停止遍历每个段落的文本样式
找到答案项
此处的 break 只打破 for run in content.runs 的循环
else: # for content in filter(lambda x: bool(x.text) ,doc[1:]) 循环结束时content_list += answer #把 answer 答案列表添加进 content_listcontent_list.insert(0,number) # content_list 列表里第一个位置插入序号ws.append(content_list) # 最后一题写入 EXcel 里wb.save(jion_path(now_path,excel_file))# 保存文件 因为二狗写的脚本,是通过处理下一题时来保存的上一题 ,所以最后一题的保存是要单独处理一下.
完整代码
【docx模块操作Word文档的简单案列 docx文档是word文档吗】import osimport re import docximport openpyxlnow_path = os.getcwd() # 获取当前 ipynb 文件的路径 doc_file = '选择题.docx' # 要提取的 doc 文件名 excel_file = '选择题.xlsx' # 保存为 Excel 的文件名 wb = openpyxl.Workbook() # 实例化 Excel 对象 ws =wb.active # 创建 Excel 活动表格 tab_head = ['序号','题目','选项 1','选项 2','选项 3','选项 4','答案'] #定义 Excel 表头 ws.append(tab_head) #表头写入 Excelstart_flag = True# 设置开始状态 content_list=[] #初始化内容列表 def jion_path(file_path,file_name):'''功能:拼接文件路径:param file_path: 固定参数,定义拼接的文件路径:param file_name: 固定参数,定义拼接的文件名称:return:返回拼接好的文件路径'''return os.path.join(file_path,file_name)doc = docx.Document(jion_path(file_path=now_path,file_name=doc_file)).paragraphs# 读取 word 文档.doc 文件 如是.docx 文件 需把文件另存为.doc 文件 number= 1 #初始化序号 for content in filter(lambda x: bool(x.text) ,doc[1:]): #遍历段落列表row = content.text.strip('试题') #去除每一题的'试题'2 字row_list = re.split(r'^\d+\W',row) # 正则切割段落文本if row_list[1:]:#判断切割后的列表的第一个元素,是否有值 Ture 为题目 False 为答案选项if start_flag: # 判断是否为第一行content_list += row_list[1:] # 如果是第一行就题目添加进空列表 content_liststart_flag = False # 重制 start_flag 为 Falseelse: # 如果不是第一行content_list += answer #把 answer 答案列表添加进 content_listcontent_list.insert(0,number) # content_list 列表里第一个位置插入序号ws.append(content_list) # 把 content_list 列表写入 Excel 里number += 1 #更新下一题的序号content_list=[] # 重置 content_list 列表为空,准备添加下一题content_list += row_list[1:] # 把题目添加进空列表 content_listelse:# 这里利用 python 的切片机制 row_list 里只有一个元素时 row_list[1:]切片会返回row_list = [i.strip() for i in re.split(r'\s{4}',row_list[0]) if i ]# 处理一行 2 答案选项的情况content_list += row_list # 把 ABCD 选项文本添加进 content_listfor run in content.runs: #遍历每个段落的文本样式 找的为红色的答案answer_color = str(run.font.color.rgb) # 获取每个段落的字体颜色if answer_color == 'FF0000' : # 判断此段落的文字是否为红色answer = re.findall(r'[A-D]{1}',run.text)#提取答案项对应的字母break # 停止遍历每个段落的文本样式 else: # for content in filter(lambda x: bool(x.text) ,doc[1:]) 循环结束时content_list += answer #把 answer 答案列表添加进 content_listcontent_list.insert(0,number) # content_list 列表里第一个位置插入序号ws.append(content_list) # 最后一题写入 EXcel 里wb.save(jion_path(now_path,excel_file))# 保存文件
推荐阅读
- PDF解除密码怎么操作 没有密码怎么解除pdf的加密
- 灭火器操作四字步骤是什么
- 热水器排污怎么操作
- CAD如何进行修改命令的操作 cad修改命令快捷键是什么
- 1分钟带你摸透CAD图案填充 cad图案填充怎么操作
- 天使之站怎么样操作出金
- 平板电脑厂家告诉你平板操作键 电脑返回键是哪个快捷键
- 手机与和U盘的连接及文件操作 手机插u盘在哪里打开
- 病毒清除操作技巧 电脑中病毒了怎么办
- CAD导入图片怎么操作 cad导入图片后怎么调整图片比例