使用 Python 操作 word文档
最近手头有一个需求是对word文档内容进行判断,搜索到一个包感觉不错,简单记录一下关键操作:
python-docx能做什么
- 创建/读取 docx文档
- 修改内容:包括段落格式、章节、标题、分页符、文档中的表格、插入图片等操作
基本上常用的功能都在里面了,我的需求是找到关键内容进行判断,因此这个包对于我来说够用。
安装
官方文档上支持3种安装方式,使用最常见的一种进行即可。
pip install python-docx
环境支持:
- python2.6、2.7,or 3.4
- lxml >= 2.3.2
快速开始
由于Word文档是二进制的文档,因此创建和读取所使用的方法有一些差别。几个关键的对象和等级区别:
最顶层是Document对象,其代表整个文档; block-level(块等级),段落是常见的块等级,换行符结尾算一个段落,表格、图片和标题均属于块对象;对于块对象属性,常见有对齐(alignment)、缩进(indent)以及行间距(space)等等; inline-level(内联等级),其属于块等级中,run是常见的内联等级,一个块对象可由多个run组成,特别是通过run可由设置不同属性样式;文字、句子、段落均可作为内联对象;对于内联对象属性,常见有字体、大小、对齐以及颜色等等
- 如果要创建一个新的文档,需要:
from docx import Document
document = Document()
# 写一个段落
paragraph = document.add_paragraph('写一个新的段落')
prior_paragraph = paragraph.insert_paragraph_before('在上一个段落前写一点内容')
# 添加标题,默认是标题1
document.add_heading('这是标题')
document.add_heading('标题2', level=2)
# 添加分页符
document.add_page_break()
表格操作
# 添加一个表,通过table.cell()来访问其中的信息
table = document.add_table(rows=2, cols=2)
# 逐个添加内容
cell = table.cell(0, 1)
cell.text = 'parrot, possibly dead'
row = table.rows[1]
row.cells[0].text = 'Foo bar to you.'
heading_cells[0].text = 'Qty'
# 支持迭代,并逐行添加
items = (
(7, '1024', 'Plush kittens'),
(3, '2042', 'Furbees'),
(1, '1288', 'French Poodle Collars, Deluxe'),
)
# 给每项添加行数据
for item in items:
cells = table.add_row().cells
图片插入
from docx.shared import Inches
document.add_picture('测试图.png', width=Inches(1.0))
通常一个300dpi的300x300像素的图片大小是1英寸,若使用cm可以通过以下表示进行计算width = Inches(3) /thing_count
修改字体等格式
paragraph = document.add_paragraph('文档')
run = paragraph.add_run('加粗')
run.bold = True
paragraph.add_run('一下')
代码所展示的内容为 「文档加粗一下」,个人感觉还是很麻烦的,因此这边就不进行下去了。有挺多相关的文档可以查阅。
- 如果对已有文档进行修改,需要:
from docx import Document
document = Document()
document.save('测试.docx')
document.save('新文档.docx')
注意:这个方法支持Word 2007及以后的版本;Word 2003及更早期的.doc文件无法使用
小应用
获取word文档中某一张表格记录的内容:
! pip install python-docx
import os
import re
import pandas as pd
from docx import Document
from docx.shared import Inches
os.chdir(r'C:UsersDRPDesktop')
document = Document('demo.docx')
tables = document.tables
res=[]
#docx库不支持doc格式
def read_table(docpath:str,n:int):
'''docpath->word文件路径
n->要读取文件中的第几个表格。从0开始
返回表格数据的列表
'''
global res
doc=Document(docpath)
tb=doc.tables[n]
for i in range(4,len(tb.rows)):
data=[]
row_cells=tb.rows[i].cells
for cell in row_cells:
data.append(cell.text)
print(data)
res.append(data)
return res
#获取文件中的第4个表格
table = tables[3]
for i in range(1, len(table.rows)): #从表格第二行开始循环读取表格数据
idNum = table.cell(i,0).text #序号
companyName = table.cell(i,1).text #读取第二列
print(companyName)
这样就可以获得表格中关键的内容了,后续即可以存入列表或者字典,或者对关键字进行检查。该方法适用于批量或者流程化提取、校验word文档内容。
参考资料
官方文档:https://python-docx.readthedocs.io/en/latest/index.html
中文版:https://www.zybuluo.com/belia/note/1303813
KAI-Python操作docx文档 :https://www.bioinfo-scrounger.com/archives/693/
- 推荐一款超强大的基于Angularjs的自动完成(Autocomplete)标签及标签组插件–ngTagsInput
- Android新组件RecyclerView介绍,其效率更好
- android wheelview实现三级城市选择
- 算法之冒泡排序
- 数据结构之链表
- Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
- 算法之红黑树
- MIDlet工作原理
- 第五章 正则表达式的拆分【修订】
- 仿今天头条加载环境文字闪动效果
- Myexclipse创建Junit测试
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 第五章 正则表达式的拆分
- android 防止反编译的若干方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 缓存 | 从本地缓存到分布式缓存, Guava, Caffeine, Memcached, Redis
- WebView三问—B站真题
- C++核心准则T.140:为所有可能重用的操作命名
- Service三问
- 事件分发机制三问
- C++核心准则T.141:如果你需要只在一个地方使用的简单的函数对象,使用无名的lambda表达式
- 基于DOM的XML文件解析类
- C++核心准则T.143:避免无意中编写非通用代码
- XML文件解析实践(DOM解析)
- golang 多协程的同步方法总结
- C++核心准则T.144:不要特化函数模板
- 三千字带你搞懂XXL-JOB任务调度平台
- Python-科学计算-pandas-14-df按行按列进行转换
- Python实现扫码工具
- C++核心准则T.150:用static_assert检查类和概念的匹配性