如何基于Python实现word文档重新排版
作者:NiceThing 发布时间:2023-06-09 11:19:24
介绍
舍友从网上下载的word题库文档很乱,手动改了大半天才改了一点,想起python是大名鼎鼎的自动化脚本,于是乎开始了python对word的一顿瞎操作。
分析需求
对文档中的内容进行分析,只留下题目,选项,并且题号要从1开始。
编写代码
pip安装python-docx模块
读取word文档内容(如果是以.doc后缀的文件需另存为.docx文件!)
from docx import Document
# 打开文件
srcdocx = Document(‘src.docx‘)
# 遍历所有段落
for p in srcdocx.paragraphs:
print(p.text)
输出效果:
分析所需要删除的内容:
需求1:
1
42.对餐后血糖显著升高的2型糖尿病者,可选用下列哪种药物(5.0分)
删除多余数字行
需求2:
42.对餐后血糖显著升高的2型糖尿病者,可选用下列哪种药物(5.0分)
修改正确的题目序号
需求3:
删除“窗体底端”“窗体顶端”
需求4:
A、
阿卡波糖
选项合成一行
需求5:
删除多余空白行
编写代码
本质上来讲,实现就是从源文档中取出一段文字进行处理操作,然后保存到目标文档。
其中,需求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}个错误!")
运行效果:
最终效果
总结
Python还是一个极为强大的工具,并且门槛低,易入门,以后我要多多学习Python!如果我的博客能给你点思路,那就发挥了很大的作用了!人生苦短,我用Python~
来源:https://www.cnblogs.com/AllenMi/p/13662796.html


猜你喜欢
- asp如何实现当前月份距离以前某个时间的月份数 如今天是2011年1月份,我想知道离2010年3月,计算这中间一共是几个月 最佳答案 <
- 记录训练过程中的每一步的loss变化 if verbose and step % verbose == 0: sys.stdout.writ
- 先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行
- Filed under 数据库技术Leave a commentSQL Server命令行导数据两种方式bcp和sqlcmd先说一下bcp:
- 学习了简单的知识点,就会想要向有难度的问题挑战,这里必须要夸一夸小伙伴们。不过我们今天不需要做什么程序的测试,只用简单的两个代码对比,小伙伴
- 使用python的json模块序列化时间或者其他不支持的类型时会抛异常,例如下面的代码:# -*- coding: cp936 -*-fro
- 前言在这篇文章 Go Mutex:保护并发访问共享资源的利器 中,主要介绍了 Go 语言中互斥锁 Mutex&
- 2008年的圣诞节LOGO依旧延续着2007年的圣诞老人、鹿车、红帽子、圣诞树、蜡烛等元素装点。当然,也少不了雪花,但在LOGO设计上,较0
- 如下所示:#先下载psutil库:pip install psutilimport psutilimport os,datetimedef
- 1、最简单的调用方式 直接写到html的body标签里面,如: <html> <body onload="fun
- 本文记录了mysql8.0.0 winx64.zip解压版安装教程,具体内容如下1、自己到mysql官网下载mysql-8.0.0-dmr-
- 1.找到配置文件-打开“开始菜单--Anaconda3文件夹--Anaconda Prompt”-输入命令: jupyter noteboo
- 这篇文章主要介绍了如何基于pythonnet调用halcon脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- #!/usr/bin/python #-*-coding:utf-8-*-from PyQt4.QtGu
- 本文实例讲述了python避免死锁方法。分享给大家供大家参考。具体分析如下:当两个或者更多的线程在等待资源的时候就会产生死锁,两个线程相互等
- Python中对于数组和列表进行切片操作是很频繁的,当然对于切片的操作可供我们直接使用的函数也是很遍历了,我们今天主要简单总结一下常用集中索
- 前言python学习之路任重而道远,要想学完说容易也容易,说难也难。很多人说python最好学了,但扪心自问,你会用python做什么了?刚
- 我们知道可以将一个海量记录的 MySQL 大表根据主键、时间字段,条件字段等分成若干个表甚至保存在若干服务器中。 唯一的问题就是跨服务器批量
- python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提
- 自适应线性神经网络Adaptive linear network, 是神经网络的入门级别网络。相对于感知器,采用了f(z)=z的激活函数,属