记一次用python对docx文档的处理
程序员文章站
2022-03-04 20:46:04
...
前言
最近,我们马原老师给了我们关于马原的例题,但是他的题和答案是分开的,总共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)
效果
结语
做完后,同学都来问我要拼接完答案的文档了。。。。
上一篇: python 打包Windows桌面程序
下一篇: 网络通信(三)UDP程序设计(java)