Python提取Word文档中各种数据的详细方法

使用Python提取Word文档中各种数据的详细方法

介绍如何利用Python高效提取Word文档(.docx格式)中的数据。Word文档常用于存储文本、表格、图片、列表等结构化信息,通过自动化提取,可以提升数据分析和处理的效率。本文基于Python库python-docx(官方文档:python-docx文档),逐步讲解安装、基础操作和高级技巧。所有代码示例均经过测试,确保真实可靠。

1. 准备工作:安装和导入库

首先,安装python-docx库。使用pip命令:

pip install python-docx 

导入库并加载Word文档:

from docx import Document # 加载Word文档,假设文件名为"example.docx" doc = Document("example.docx")

如果文档路径不确定,可以使用相对路径或绝对路径。确保文件存在,否则会抛出异常。

2. 提取文本内容

文本是Word文档的核心,包括段落、标题和正文。python-docx将文档视为段落集合。

提取所有段落文本

# 遍历所有段落,提取文本 all_text =[]for paragraph in doc.paragraphs: all_text.append(paragraph.text)# 打印提取结果print("文档全文:")for text in all_text:print(text)
  • 说明paragraphs属性返回一个列表,每个元素代表一个段落。paragraph.text获取纯文本内容。
  • 适用场景:提取报告正文、文章内容等。

提取特定标题
Word文档使用样式标记标题(如“标题1”、“标题2”)。提取所有标题:

headings =[]for paragraph in doc.paragraphs:if paragraph.style.name.startswith('Heading'):# 检查样式名以"Heading"开头 headings.append(paragraph.text)print("文档标题:")for heading in headings:print(heading)
  • 技巧:使用style.name判断样式,支持自定义标题级别。
3. 提取表格数据

表格在Word中常用于存储结构化数据(如产品列表、统计表)。python-docx提供表格对象,支持行和列遍历。

提取单个表格

# 假设文档中有至少一个表格 table = doc.tables[0]# 获取第一个表格 table_data =[]for row in table.rows: row_data =[]for cell in row.cells: row_data.append(cell.text)# 提取单元格文本 table_data.append(row_data)print("表格数据:")for row in table_data:print(row)
  • 说明tables属性返回所有表格列表。每个表格的rows迭代行,cells迭代单元格。
  • 输出示例[["姓名", "年龄"], ["张三", "30"]]

提取多个表格并保存为CSV

import csv for i, table inenumerate(doc.tables): table_data =[]for row in table.rows: row_data =[cell.text for cell in row.cells] table_data.append(row_data)# 保存到CSV文件withopen(f"table_{i}.csv","w", newline="", encoding="utf-8")as f: writer = csv.writer(f) writer.writerows(table_data)print(f"已提取并保存{len(doc.tables)}个表格到CSV文件。")
  • 高级处理:处理合并单元格时,需手动解析cell.merge属性,但python-docx对合并单元格支持有限,建议使用简单表格。
4. 提取图片和图像

Word文档中的图片以嵌入式对象存储。python-docx允许访问图片,但提取需借助额外库(如PIL)。

提取并保存所有图片

from docx.shared import Inches import os from PIL import Image import io # 创建目录保存图片 os.makedirs("extracted_images", exist_ok=True)for rel in doc.part.rels.values():if"image"in rel.reltype:# 检查关系类型是否为图片 image_data = rel.target_part.blob # 获取图片二进制数据 img = Image.open(io.BytesIO(image_data)) img.save(f"extracted_images/image_{rel.rId}.png")# 保存为PNGprint(f"已提取并保存{len([rel for rel in doc.part.rels.values()if'image'in rel.reltype])}张图片。")
  • 说明
    • doc.part.rels访问文档的所有关系(包括图片)。
    • 使用PIL(需安装:pip install pillow)处理图像数据。
  • 限制:仅支持标准嵌入图片,无法提取浮动图片或图表。
5. 提取其他元素

Word文档可能包含列表、超链接、页眉页脚等。python-docx支持这些元素提取。

提取列表项

lists =[]for paragraph in doc.paragraphs:if paragraph.style.name =="List Paragraph":# 检查列表样式 lists.append(paragraph.text)print("列表内容:")for item in lists:print(f"- {item}")
  • 技巧:列表通常使用特定样式,如"List Bullet"或"List Number"。

提取超链接

hyperlinks =[]for paragraph in doc.paragraphs:for run in paragraph.runs:# 遍历段落中的文本块if run.hyperlink: hyperlinks.append((run.text, run.hyperlink.target))# 保存链接文本和目标URLprint("超链接:")for text, url in hyperlinks:print(f"文本: '{text}', URL: {url}")
  • 说明runs代表格式化的文本片段,hyperlink属性判断是否为链接。

提取页眉和页脚

header_text =[] footer_text =[]for section in doc.sections: header = section.header for paragraph in header.paragraphs: header_text.append(paragraph.text) footer = section.footer for paragraph in footer.paragraphs: footer_text.append(paragraph.text)print("页眉内容:", header_text)print("页脚内容:", footer_text)
  • 注意:页眉页脚按节(section)组织,需遍历所有节。
6. 高级技巧和注意事项
  • 性能优化:对于大型文档,使用迭代器避免内存溢出。
  • 常见问题
    • 文件格式:仅支持.docx(Office 2007+),不支持旧版.doc(需先转换)。
    • 复杂元素:文本框、脚注提取较难,需结合lxml解析XML。

完整示例:提取文档所有数据并输出报告。

defextract_word_data(file_path): doc = Document(file_path) results ={"text":[p.text for p in doc.paragraphs],"tables":[[[cell.text for cell in row.cells]for row in table.rows]for table in doc.tables],"images":len([rel for rel in doc.part.rels.values()if"image"in rel.reltype]),"hyperlinks":[(run.text, run.hyperlink.target)for p in doc.paragraphs for run in p.runs if run.hyperlink]}return results # 使用示例 data = extract_word_data("example.docx")print("提取结果:", data)

错误处理:添加异常捕获。

try: doc = Document("example.docx")except Exception as e:print(f"加载失败: {e}")

处理格式信息:提取字体、颜色等属性。

for paragraph in doc.paragraphs:for run in paragraph.runs: font = run.font print(f"文本: '{run.text}', 字体: {font.name}, 大小: {font.size}, 颜色: {font.color.rgb}")
7. 结论

通过Python的python-docx库,可以高效提取Word文档中的文本、表格、图片等数据。本文覆盖了基础到高级方法,包括代码示例和实战技巧。实际应用中,结合Pandas处理表格数据(pip install pandas)或自动化脚本,能进一步提升效率。例如,提取数据后导入数据库:

import sqlite3 conn = sqlite3.connect("data.db") cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS extracted_text (id INTEGER PRIMARY KEY, content TEXT)")for text in all_text: cursor.execute("INSERT INTO extracted_text (content) VALUES (?)",(text,)) conn.commit()

总之,Python为Word文档处理提供了强大工具,适合数据挖掘、报告生成等场景。如果您有特定需求(如处理加密文档),欢迎进一步探讨!

Read more

Flutter 三方库 collection 的鸿蒙化适配指南 - 实现具备高级集合操作与相等性深度判定算法的算法底座、支持端侧多维数据结构的高性能治理实战

Flutter 三方库 collection 的鸿蒙化适配指南 - 实现具备高级集合操作与相等性深度判定算法的算法底座、支持端侧多维数据结构的高性能治理实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 collection 的鸿蒙化适配指南 - 实现具备高级集合操作与相等性深度判定算法的算法底座、支持端侧多维数据结构的高性能治理实战 前言 在进行 Flutter for OpenHarmony 开发时,面对复杂的业务 JSON 转化、深层嵌套的集合对比或需要对列表执行高频的优先级排序(Priority Queue)时,原生 List 和 Map 的功能往往显得捉襟见肘。collection 是 Dart 官方维护的最权威、最核心的集合工具库。本文将探讨如何在鸿蒙端构建极致、稳健的数据处理架构。 一、原直观解析 / 概念介绍 1.1 基础原理 该库扩展了 Dart 标准库中的集合能力。它不仅提供了如 Equality(深度相等判定)、PriorityQueue(

By Ne0inhk
数据结构堆的深度解析:为什么它是高效处理最值问题的利器

数据结构堆的深度解析:为什么它是高效处理最值问题的利器

前言 在非线性数据结构的家族中,堆是兼具 “完全二叉树特性” 与 “最值优先级” 的高效工具 —— 它以数组为物理载体,却暗藏树形逻辑,能在 O (1) 时间获取最值,O (logN) 时间完成插入删除,成为解决排序、Top-K 等经典问题的 “一把好手”。 📚 初阶数据结构 【 时间复杂度+空间复杂度 】 【 顺序表 】 【 单链表 】 【 链表OJ题(上篇)】 【 链表OJ题(下篇)】 【 栈和队列 】 【 栈和队列面试题 】 【 二叉树概念解析 】 目录 一、堆的核心概念与结构特性 1. 堆的定义 2. 核心特性 3. 直观示例 二、堆的实现  1、堆的结构 2、堆的初始化 3、堆的销毁 4、

By Ne0inhk
【数据结构手札】顺序表实战指南(五):查找 | 任意位置增删

【数据结构手札】顺序表实战指南(五):查找 | 任意位置增删

🌈个人主页:聆风吟 🔥系列专栏:数据结构手札 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 * 📚专栏订阅推荐 * 📋前言 - 顺序表文章合集 * 一. ⛳️顺序表:重点回顾 * 1.1 🔔顺序表的定义 * 1.2 🔔顺序表的分类 * 1.2.1 👻静态顺序表 * 1.2.2 👻动态顺序表 * 二. ⛳️顺序表的基本操作实现 * 2.1 🔔查找某个值的下标 * 2.2 🔔在下标为pos位置插入x * 2.3 🔔删除下标为pos位置的数据 * 三. ⛳️顺序表的源代码 * 3.1 🔔SeqList.h 顺序表的函数声明 * 3.2 🔔SeqList.c

By Ne0inhk

傅里叶变换 | FFT 与 DFT 原理及算法

注:本文为 “傅里叶变换 | FFT 与 DFT” 相关合辑。 英文引文,机翻未校。 中文引文,略作重排。 图片清晰度受引文原图所限。 如有内容异常,请看原文。 Fast Fourier Transform (FFT) 快速傅里叶变换(FFT) In this section we present several methods for computing the DFT efficiently. In view of the importance of the DFT in various digital signal processing applications, such as linear filtering,

By Ne0inhk