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读取word文档中的图片_【Python 3 获取Word所有图片】
上次讲到如何手动快速提取Word文档中的所有图片.这次我们用Python-3基于图片提取原理,写代码实现自动获取. Python 3实现代码import os,zipfile,shutil #引入os ...
- word文档纯字数统计_如何在您的Word文档中插入字数统计
word文档纯字数统计 Word tracks certain summary information about documents, such as the number of words in ...
- word如何删除空行和全角空格_如何快速批量删除word文档中多余的空行
我们在网上收集信息资料的时候,觉得不错就会将其拷贝到word文档进行收藏.但是由于拷贝过来可能文件里面太多空格和字符符号之类,导致文档过长,占用了不必要的空行,甚至我们用来打印word文档就会导致浪费 ...
- 教你用8行代码将word转换为pdf格式 及 6行代码实现批量将word转换为pdf格式--python实用小技能get起来
目录 将word转换为pdf格式 安装pywin32 上代码 运行结果 批量实现word转pdf 安装docx2pdf 上代码 运行结果 将word转换为pdf格式 安装pywin32 代码(Anac ...
- python快速上手 让繁琐工作自动化 英文版_入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码...
入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...
- word存为html图片有两个,如何批量保存Word图片?另存为Word多个图片的方法
如何批量保存Word图片?很多用户在发送Word文档的时候都没有附上原图的习惯,导致接收方需要使用Word文档中的图片的时候还需要一个个另存为下载,当然,这是不明智的行为,如果你曾经历过这些,一定想知 ...
- python中以下关于列表描述错误的_在Python中,以下关于函数的描述错误的是哪一项?...
[判断题]Python内置函数len____可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. [判断题]Python内置函数max____用来返回序列中的最大元素. [判断题]Py ...
- 利用python的turtle库绘制玫瑰的步骤_用python turtle画玫瑰
1.turtle 库 2.画玫瑰的代码: import turtle turtle.penup() turtle.left() turtle.fd() turtle.pendown() turtle. ...
- python 某个数是不是在某个范围内_这个Python入门教程,国内12岁小孩都能做,是小白的入门不二之选...
简介:你曾经想知道计算机是如何工作的吗?尽管我们不能在一篇文章里面教会你所有的东西,但是可以通过学习如何写出你自己的程序来获得一个良好的开端.在这篇Python教程中,你将会学到计算机编程的基础知识, ...
最新文章
- sketch如何做设计稿交互_交互设计师是做什么的——交互设计的历史、现状和未来...
- 学习人工智能必须攻克三道门槛:数学基础、英语水平与编程技术
- 如何接触到最新的前端动态、最前沿的前端技术
- PHP异常与错误处理机制
- c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...
- 一行或多行文本内容溢出显示省略号
- 离线安装PostgreSQL
- PHP获取访客ip、系统、浏览器等信息[转]
- HDU 1019 least common Multipy
- 用python刷微信投票_微信投票知道 微信刷票能否python抓取微信投票_大师网络投票刷票网...
- 北京中国石油大学计算机考研分数线,中国石油大学(北京)2018年考研复试基本分数线...
- 一步步打造自己的通用上拉加载布局
- python爬虫—爬取taptap游戏的评论信息(通过fiddler抓包)
- JAVA 支付宝支付_史诗级简单教程(SpringBoot)
- QQ一键登录助手_DedeCMS插件_适合FOR V55 V56 V57_GBK.zip
- 包对象之Oracle如何编译失效包体
- 【Ant Design】图标大全(网断专用)
- python爬虫微博24小时热搜_Python爬虫之微博热搜
- iOS待办提醒事项可以在日历里显示了?来教你们设置
- python输出所有素数_Python题目编程输出3到100 内的所有素数
热门文章
- 文件下载及web文件的contentType类型大全
- Nuget如何自动下载依赖DLL引用
- (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
- 折线图设置圆点_Seaborn可视化 折线图seaborn.lineplot
- 数据3分钟丨Databricks与Snowflake开撕;阿里云多款自研数据库支撑首个“100%云上双11”...
- 【总议程】2021全球分布式云大会·上海站明日开幕!墨天轮将全程线上直播
- 从Oracle到PostgreSQL:动态性能视图 vs 标准统计视图
- 【假期重磅福利】更新三个Oracle系列课程,共153课时,最低免费获取
- 没想到,我们的分布式缓存竟这样把注册中心搞垮!
- 云图说|图解DGC:基于华为智能数据湖解决方案的一体化数据治理平台