记一次用python对docx文档的处理

标签: python

前言

最近,我们马原老师给了我们关于马原的例题,但是他的题和答案是分开的,总共96页。当时,我就???。总不能看几道题就往后翻吧,那可是九十页的啊。让我一个一个的移答案?那是不可能的。于是我就想用python来替我完成。

文档结构

题目分为单选题、多选题、和简答题(简答题没有答案)。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
欧克。了解了文档的结构,那么现在就开始完成这项任务。

代码的编写

首先引入库。

import docx
import re 
import sys

为了更好的显示进度,我在分割答案、拼接答案、写入文件这三个过程中都加了进度条。

分割答案

然后定位答案的位置,将答案弄到两个列表中(第一题和第二题)。
在分割答案时,本来我想用空格来分割的,但是他给的答案中空格并不是一样的,这就可能造成有空元素,和答案分割错误。最后,我决定用正则来匹配数字来分割。

try:
	doc = docx.Document("马克思主义基本原理概论.docx")
	first = []
	second = []
	flag1 = 0
	for i in range(4076,4099):
	
		sys.stdout.write(' ' * 90 + '\r')
		sys.stdout.flush()
		sys.stdout.write("正在读取答案中({0:.2f}%):".format((i+1-4076)/23*100)+"["+"#"*int((i+1-4076)/23*40)+"-"*(40-int((i+1-4076)/23*40))+"]"+'\r')
		sys.stdout.flush() //进度条
		
		txt = doc.paragraphs[i].text
		if txt.split('、')[0] == "一":
			flag1 = 1
			continue
		elif txt.split('、')[0] == "二":
			flag1 = 2
			continue
		if flag1 == 1:
			strinfo = re.compile(r"\d+\d*")
			t = strinfo.sub('**',txt)
			t = t.split("**")
			for j in range(len(t)):
				if t[j] != "" and t[j] != '    ':
					first.append(t[j])
		elif flag1 == 2:
			strinfo = re.compile(r"\d+\d*")
			t = strinfo.sub('**',txt)
			t = t.split("**")
			for j in range(len(t)):
				if t[j] != "" and t[j] != '    ':
					second.append(t[j])
	
	print("\n完成!")
except Exception as e:
	print(e)

拼接答案

在这里,我遇到了难题,如何判断到了下一道题。我想到我刚用到了正则,那么我就判断第一个字符如果是数字,那么就是题,如果不是数字,就是选项。
但是,当我打出初稿时,运行了一下,发现多选题长度不对,然后我又看了下文档。我去,他有的答案没有。但是万幸的是,没有的题号是连着的。
在这里插入图片描述

try:
	flag2 = 0
	count = 0
	for i in range(1,4076):
		n = 3918
		sys.stdout.write(' ' * 90 + '\r')
		sys.stdout.flush()
		sys.stdout.write("正在拼接答案中({0:.2f}%):".format((i)/n*100)+"["+"#"*int((i)/n*40)+"-"*(40-int((i)/n*40))+"]"+'\r')
		sys.stdout.flush() //进度条
		
		txt = doc.paragraphs[i].text
		if txt.split('、')[0] == "一":
			flag2 = 1
			count = 0
			continue
		elif txt.split('、')[0] == "二":
			flag2 = 2
			count = 0
			continue
		elif txt.split('、')[0] == "三":
			break
		
		if flag2 == 1:
			try:
				txt = doc.paragraphs[i].text
				s = re.compile(r"\d")
				n = s.match(txt[0])
				if n :
					doc.paragraphs[i].text = doc.paragraphs[i].text + first[count]
					count += 1
			except:
				continue
		elif flag2 == 2:
			try:
				txt = doc.paragraphs[i].text
				if txt[:3].isdigit():
					if 170<int(txt[:3])<279:
						continue
				s = re.compile(r"\d")
				n = s.match(txt[0])
				if n :
					doc.paragraphs[i].text = doc.paragraphs[i].text + second[count]
					count += 1
			except:
				continue
	
	print("\n完成!")
except Exception as e:
	print(e)

写入文件

最后就是写入文件,我是没有添加格式的写入。

try:
	document = docx.Document()
	for i in range(0,4076):
		document.add_paragraph(doc.paragraphs[i].text)
		n = 4076
		
		sys.stdout.write(' ' * 90 + '\r')
		sys.stdout.flush()
		sys.stdout.write("文件正在写入中({0:.2f}%):".format((i+1)/n*100)+"["+"#"*int((i+1)/n*40)+"-"*(40-int((i+1)/n*40))+"]"+'\r')
		sys.stdout.flush() //进度条
		
	document.save('demo.docx')
	print("\n完成!")
except Exception as e:
	print(e)

效果

在这里插入图片描述
在这里插入图片描述

结语

做完后,同学都来问我要拼接完答案的文档了。。。。

版权声明:本文为weixin_44215027原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44215027/article/details/90727298