Word 文档在我们的工作中扮演着重要角色,各种合同、通知、请示等基本都采用 Word 格式。对于单个 Word 文档,我们可以手动读取内容、写入内容以及调整样式。但如果面对成千上万个文档呢?这时就需要借助 Python 编程来实现自动化处理了。
读取 Word 文档中的图片
在 python-docx 模块中,并没有提供获取 Word 文档中图片的方法。如果要提取 Word 文档中的图片,可以使用 Python 标准库自带的 zipfile 模块,直接使用即可,无需额外安装。
这里先介绍 zipfile 模块中几个常用的方法和属性:
ZipFile():用于读取或创建一个 zip 文件对象。
infolist():用于获取 zip 文档内所有文件的信息,返回由 ZipInfo 对象组成的列表。
filename:用于获取文件的名称。
extract():将 zip 文档内的指定文件解压到指定目录(或称为“文件夹”)中。
下面这份 Word 文档,里面包含 2 张图片。我们将利用 zipfile 模块提取其中的图片。

在交互式环境中输入如下命令:
import os
from zipfile import ZipFile
zip_file = ZipFile("读取图片.docx", "r")
for info in zip_file.infolist():
print(info.filename)
# 输出:
# [Content_Types].xml
# _rels/.rels
# word/_rels/document.xml.rels
# word/document.xml
# word/footnotes.xml
# word/endnotes.xml
# word/media/image1.png
# word/media/image2.png
# word/theme/theme1.xml
# word/settings.xml
# word/styles.xml
# word/webSettings.xml
# word/fontTable.xml
# docProps/core.xml
# docProps/app.xml
for info in zip_file.infolist():
file_name = info.filename
if file_name.endswith((".png", ".jpeg", ".jpg")):
zip_file.extract(info.filename, os.getcwd())

逐步拆解一下这段代码的逻辑。
首先,导入 zipfile 模块中的 ZipFile() 方法(见第 1 行)。调用该方法可以帮助我们创建一个 zip_file 对象(见第 2 行),参数 "r" 表示以读取模式打开文件。
接着,调用该对象的 infolist() 方法,返回的是文件信息对象组成的列表(见第 3 行)。
我们可以利用 for 循环遍历列表中的每个元素,并调用 filename 属性,打印每个具体的文件名(见第 4 行)。
观察上述文件名,图片一般是以 .png 后缀结尾的。此时可以搭配 if 条件语句,如果文件名是以 png、jpeg 或 jpg 结尾的,就证明它是一张图片(见第 5 行)。最后,调用 zip_file 对象的 extract() 方法,将图片提取到当前工作目录下的 word/media 文件夹中(见第 6 行),最终效果如图所示。

小贴士
提取 Excel 文档中的图片,也可以使用同样的方法。
看到这里你会发现,所谓的“读取 Word 文档中的图片”,本质上就是把 .docx 文件当作一个 zip 压缩包来处理。Word 从 2007 版本开始采用的 Office Open XML 格式,底层就是一个 ZIP 归档,图片统一存放在 word/media 目录下。理解了这一点,后续无论是提取图片、替换内容还是做文档批量分析,思路都会清晰很多。更多 Python 自动化办公的实战技巧,也欢迎到 云栈社区 一起交流探讨。
|