python批量处理word格式_用python批量处理word文档
应我家领导要求,开发一个word文档批处理脚本,涉及word文档、excel表格、文件存取、排序与索引、简单GUI等内容,前期针对各分项功能实现写了几篇小文章,现在将总体思路记录一下,作为这个系列的完结篇。
由于针对目标文档进行了很多特定操作,源代码本身不具备通用性,下面主要精讲其中的关键部分。完整代码、示例文档详见:
开发需求:
素材为批量word文档集(docx):位于original文件夹中。文件名为“N.xxxx.docx”(N为数字、xxxx为文档标题)。(见附图)
文件内容为各类新闻报道,排版为标题、正文内容(包括图片)、签名尾行(署名+日期)。(见附图)
需实现的功能包括:
建立文档清单,清单内容包括序号、署名、日期、标题。
排序文档清单,署名+日期联合排序,署名按照指定的排序规则表排序(见附图)。
筛选文档,从清单中筛选满足特定要求(比如日期范围)的文档,生成筛选后的清单,并从原始文档集中提取这些文档。
修订文档,将文档重新排版(标题行+空一行+正文段落+签名尾行+空两行),并校订文档中的标点错误(英文标点误用、省略号不准确等)。
合并文档,将筛选、修订后的文档合并为一个统一的文档,保持各子文档的排版格式不变。
图形界面,正逢领导生日,所以除了好用,还要好看,传送门在此:爱coding:心形绘制的小改进:turtle模块
original文件夹示例
文档内容示例
排序规则表.txt
逻辑图设计:
对程序主体逻辑梳理如下。
关键代码实现:
清单操作
程序涉及的清单包括:default_database.xls(原始清单,如没有提供则需生成)、all_queued.xls(按照媒体、时间排序后的总清单)、screen_queued.xls(特定年份的清单)。为便于查看,这些清单都要求生成Excel表格。
原始清单(如有)采用xlrd模块读取,所有清单生成则采用xlwt模块。xlrd、xlwt模块基本概念和涉及到的操作在另一篇文章中介绍:
其中重复进行的操作,如excel表格生成(genXls())独立为函数,通过函数调用来实现复用,以减少代码量。
其中比较重要的一点就是对时间格式的处理。日期相关操作采用datetime模块,时间格式转换采用time模块。
word文档、excel表格中文本格式表示的日期:
首先通过正则表达式搜索得到文本格式的日期datestr,然后识别日期分隔符(’/’, ‘-‘等),并采用time.strptime()从字符串中提取年月日数值,最后通过datetime.datetime()构造日期格式数据。
date_pat = re.compile('\d{4}\D\d{1,2}\D\d{1,2}') # 日期格式的正则表达式YYYYxMMxDD
...
sch = re.search(date_pat, para.text) #提取文本格式的日期
if sch: #如匹配到日期
datestr = para.text[sch.start() : sch.end()]
split = []
for char in datestr: #识别日期分隔符
if char not in digit:
split.append(char)
y, m, d = time.strptime(datestr,
'%Y' + '%s' % split[0] + '%m' + '%s' % split[1] + '%d')[0:3] #提取年月日数值
date = datetime.datetime(y, m, d) #构造datetime日期格式
excel表格中日期格式表示的日期:
从excel中读取的日期是一个浮点数,需采用xlrd.xldate_as_datetime(cell,0)转为datetime.datetime日期格式。
向excel写入日期时,通过ws.write(r, c, content, mf)中的mf(style实例)设置成excel日期格式。
mf = xlwt.XFStyle()
mf.num_format_str = 'yyyy/mm/dd' #设置日期格式为:年/月/日
ws.write(r, c, content, mf)
另外一点就是excel表格中的文档清单排序,包括按媒体(排序规则表.txt)和按日期进行排序。特别是按媒体名称排序,为避免前序操作改变了后续步骤的索引位置,采用倒序的冒泡法排序,具体方法见:
文档操作
文档操作包括:对单篇文档的文字、格式修订;多篇文档合成为一个总文档。
文档操作整体采用docx模块,其中文字修订采用正则表达式来搜索(string、re模块)。docx模块基本概念和涉及到的操作在另一篇文章中介绍:
其中重复进行的操作,如文档格式设置(setdocStyle())、文本内容修订(refText())独立为函数,通过函数调用来实现复用,以减少代码量。
setdocStyle()直接调用可设置为默认格式(包括字体、字体大小、首行缩进、段前间距、段后间距、行距等),也可通过关键字参数修改格式。
refText()可实现对所有文本内容的检查和修正,目前实现了中英文标点符号的修订、回引号缺失修正、省略号错误提示。
word文档图片提取值得详细说明一下,图片提取采用了zipfile模块。
大家知道docx模块可通过doc.inline_shapes提取所有内联图形,也即嵌入方式插入文档的图形。但是,其他方式(比如浮于文字上方、四周环绕等)的图片不会包括在doc.inline_shapes中,这些图片只能通过doc.paragraphs[n].runs[m].element.drawing_lst来识别。
docx格式本质是xml文件的压缩包,将docx文档后缀名改为zip,然后解压缩,就可以得到如下图所示的内容,其中word文件夹为文档主要信息储存位置,该文件夹中的media文件夹即包括所有图片内容(按文档中的顺序命名)。
docx文档解压缩后的内容
word文件夹打开后的内容
因此,本文通过块中的drawing_lst来判断文档中是否有图片,对于有图片的文档,采用zipfile解压缩提取media文件夹中的所有图片。实例代码如下。
# 指定用于提取图片的临时zip文件、文件夹
temp_zip = 'temp.zip'
temp_dir = 'temp'
fig_unloaded = True #记录图片是否已经载入
...
# doc.inline_shapes无法识别非嵌入式图片,故直接从段落块判定有无图
if run.element.drawing_lst:
if fig_unloaded: #如本doc还未载入图片,此处载入
silence = shutil.copy(os.path.join(src_dir, doc_name), temp_zip)
f = zipfile.ZipFile(temp_zip)
for file in f.namelist():
if file.startswith('word/media/image'):
silence = f.extract(file, temp_dir)
f.close()
img_dir = os.path.split(silence)[0]
img_list = os.listdir(img_dir) #所有图片路径的清单
fig_unloaded = False #本文档图片已载入,不再重复载入
...
# 临时文件清理
if os.path.exists(temp_zip):
os.remove(temp_zip)
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)
图片插入word文档,则采用doc.paragraphs[n].runs[m].add_picture()完成,不再细讲。
欢迎关注我的公众号(zz-icoding),以后将逐步整理成系列化的python学习资源。
python批量处理word格式_用python批量处理word文档相关推荐
- python怎么读取sav格式_利用Python读取外部数据文件
利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...
- python爬贴吧回复_通过python爬取贴吧数据并保存为word
前言 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发 ...
- 基于python爬虫技术的应用_基于Python爬虫技术的应用
办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...
- python模糊匹配忽略大小写_在python中忽略大小写的简单方法?
如果搜索多个单词,则创建一个集合是有意义的:print(set(brown_sents).intersection(zip(repeat(most_ambiguous_word), word_clas ...
- xml格式的word转为标准格式_保持的怎么保证Word格式不变?4个技巧需要带走
来自word妹,侵联系删 在处理文档时,我们时常需要复制或者插入内容等,那如何保持格式不发生变化呢?本期与大家分享4个保持格式不变的Word技巧. 1.复制内容,如何保持与文本格式一致? 复制文本内容 ...
- svn回退后如何再还原_设计师如何管理自己的文档
随着项目的积累,我们的文件目录会变得十分的盘大,如果不好好管理,将会变得一团糟,有时会影响到我们工作的效率与心情,好的文档管理方式会在一定程度上让我们的工作更加有序,即时文件目录再多,按照已经制定好的 ...
- wps如何在目录里面打省略号_在wps中怎么让文档目录的省略号对齐 - 卡饭网
怎么在WPS中快速统计文档字数? 怎么在WPS中快速统计文档字数? 相信很多小伙伴在日常办公中都有用到WPS,在其中如何才能统计文档字数呢?方法很简单,下面小编就来为大家介绍.具体如下:1. 首先,打 ...
- word打开wps文件乱码_Word打开WPS文档成乱码怎么办
Word打开WPS文档成乱码怎么办 最近一位同事拿来一篇WPS做的论文,请我帮他修改后再打印出来,我的电脑中安装的字处理软件是Word XP.记得Office XP中自带了WPS文档转换器,一向没机会 ...
- 删除Office Word (Excel)中Recent Document最近文档中本地和online打开文件路径已经不存在的文件记录
上次写了一篇删除Office(Word,Excel,PowerPoint)中Recent Document最近文档地址不存在的文件,注重从注册表中删除记录,后来发现有问题,online打开文件的记录在 ...
- 显示法定格式的日期合同和其他法律文档中经常使用下列日期格式: Dated this day of ,19 . (严格的格式要求)
程序:显示法定格式的日期合同和其他法律文档中经常使用下列日期格式: Dated this day of ,19 . 编写程序用来显示这种格式的日期.用户以月/日的格式录入日期,然后计算机 ...
最新文章
- 《图像分类》概述,李飞飞经典CS231N2021《卷积神经网络视觉识别》课程第二讲!...
- 安装LINUX后要怎么找回WIN7启动项?
- 原创经验:微信小程序开发总结
- Simulink仿真 第八节 积分模块
- Caffe学习系列(1):安装配置ubuntu14.04+cuda7.5+caffe+cudnn
- 视频解码芯片SAA7111A的初始化
- ie浏览器中 textarea 不能自动换行
- 动态规划入门G - Super Jumping! Jumping! Jumping! (有关最优子序列的一个相关题目)...
- 基于FreeFEM++的有限元编程--2
- java 操作word宏_java调用microsoft office(如word、excel)的宏 | 学步园
- 解决mysql报错ERROR 2002 (HY000)
- 使用Python处理excel表格(openpyxl)教程
- Window 10 电源高性能模式设置
- 圆梦之旅 – 日本(一)攻略篇
- 先验分布,后验分布,似然函数
- 基于K均值算法的鸢尾花聚类实验(Sklearn实现)
- c++最佳情侣身高差(来测一测)
- 软件流程和管理(七):个人、激励和团队
- 解决方案|电力行业应如何应对数字化转型危机
- create-react-app :无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\create-react-app.ps1,因为在此系统上禁止运行
热门文章
- c语言程序设计题目湖南大学,湖南大学C语言期末考试样卷
- 计算机无纸化考试合卷答题笔记卡,高级会计师无纸化考试攻略都在这 第一次考也不用慌...
- 超级授权专业版 SuperSU Pro v2.68 简体中文版
- 长尾理论 推荐系统长尾理论
- python扫码点餐系统_微信小程序源代码带后台 扫码点餐系统 python Django 前后端分离...
- 迅捷在线PDF转换成Word转换器简介
- Android移动数据开关开启关闭方法
- 6 - 常用模块(os,sys,timedatetime,random,jsonpicle,shelve,hashlib)
- 神秘的罗斯柴尔德家族
- Ruby erb模板文件生成html网页的示例