欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-04 20:46:04
...

前言

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

文档结构

题目分为单选题、多选题、和简答题(简答题没有答案)。
记一次用python对docx文档的处理记一次用python对docx文档的处理
记一次用python对docx文档的处理记一次用python对docx文档的处理
欧克。了解了文档的结构,那么现在就开始完成这项任务。

代码的编写

首先引入库。

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)

拼接答案

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

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)

效果

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

结语

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

相关标签: python