编写代码
本质上来讲,实现就是从源文档中取出一段文字进行处理操作,然后保存到目标文档。
其中,需求1,3,5的实现,只需要判断一下取出的内容是否是需要删除的内容,如果是,则不用保存到目标文档中,这样就实现了“间接删除”。
对于需求2的实现,通过观察我们不难发现,序号后面总有一个". ",所以我们只需要获取到这个的坐标,把前面的错误序号删除,插入正确的序号到处理字符串,最后保存到新文档,这样就完成了“修正题目序号”。
需求4的实现类似需求2,只需要找到 “、” 符号就行,然后进行类似操作,就能实现 “合并两行”。
from docx import Document
# 判断字符串是否为数字
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
# 修正错误题目序号
# src,源字符串 nPos,序号结束下标 cnt,正确序号
def changeNum(src,nPos,cnt):
s = src[:0] + src[nPos:]
str_list = list(s)
str_list.insert(0, str(cnt))
dest = ''.join(str_list)
return dest
# 源文档
srcdocx = Document('src.docx')
# 目标文档
outDocx = Document()
idx = 0 # 遍历下标
length = len(srcdocx.paragraphs) # 总段落数
cnt = 1 # 遍历序号
sum = 1 # 修改总次数
while(1):
if idx >= length:
break
src = srcdocx.paragraphs[idx].text
# 实现需求1,3,5
if((src == "窗体底端") or (src =="窗体顶端") or (src == "") or (is_number(src))) :
print(f"正在修改第{sum}处错误 {src}")
sum = sum + 1 # 计算修改的次数
idx = idx + 1
continue
# 实现需求2
nPos1 = src.find(".")
if nPos1 != -1 :
# 查找到有序号的行
dest = changeNum(src,nPos1,cnt)
print(f"正在修改第{sum}处错误 {src}")
sum = sum + 1 # 计算修改的次数
cnt = cnt + 1 # 序号后移
outDocx.add_paragraph(dest) # 写入数据到新word
# 实现需求4
nPos2 = src.find('、')
if nPos2 != -1 :
src2 = srcdocx.paragraphs[idx+1].text
outDocx.add_paragraph(src+src2)
idx = idx + 1
print(f"正在修改第{sum}处错误 {src},{src2}")
sum = sum + 1 # 计算修改的次数
idx = idx + 1
outDocx.save('out.docx')
print(f"修改完成!共计{sum}个错误!")
运行效果: