如何基于Python实现word文档重新排版


Posted in Python onSeptember 29, 2020

介绍

舍友从网上下载的word题库文档很乱,手动改了大半天才改了一点,想起python是大名鼎鼎的自动化脚本,于是乎开始了python对word的一顿瞎操作。

如何基于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)

输出效果:

如何基于Python实现word文档重新排版

分析所需要删除的内容:

需求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实现word文档重新排版

最终效果

如何基于Python实现word文档重新排版

总结

Python还是一个极为强大的工具,并且门槛低,易入门,以后我要多多学习Python!如果我的博客能给你点思路,那就发挥了很大的作用了!人生苦短,我用Python~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
Python遍历目录的4种方法实例介绍
Apr 13 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
Django ModelForm组件使用方法详解
Jul 23 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
python 实现两个线程交替执行
May 02 Python
python实现简单贪吃蛇游戏
Sep 29 #Python
python爬虫---requests库的用法详解
Sep 28 #Python
如何在scrapy中捕获并处理各种异常
Sep 28 #Python
python向企业微信发送文字和图片消息的示例
Sep 28 #Python
python利用tkinter实现图片格式转换的示例
Sep 28 #Python
python在CMD界面读取excel所有数据的示例
Sep 28 #Python
python调用摄像头的示例代码
Sep 28 #Python
You might like
一个域名查询的程序
2006/10/09 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
python 图像增强算法实现详解
2021/01/24 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
火车来了教学反思
2014/02/11 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
品牌转让协议书
2014/08/20 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
小学教师师德整改措施
2014/09/29 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python