告别重复复制粘贴,Python助你高效处理办公文档
在日常工作中,我们常常需要从Word文档中提取内容:可能是整理报告中的表格数据,提取文章中的图片素材,或者批量处理多个文档的文字内容。今天,就给大家介绍一个强劲的Python库——python-docx,帮你轻松实现Word文档的自动化处理!
一、python-docx:Word文档的Python解析器
python-docx是一个专门用于读取、查询和修改Microsoft Word (.docx)文件的Python库。它让我们能够以编程方式操作Word文档,极大地提高了文档处理的效率。
安装简单
pip install python-docx
二、实战:三步提取Word文档全内容
让我们通过一个完整的示例,看看如何提取Word文档中的文字、表格和图片。
1. 文字内容提取:不仅仅是纯文本
文字提取是基础,但python-docx能做的远不止这些:
from docx import Document
class DocxParser:
def __init__(self, docx_path: str):
self.docx_path = docx_path
self.docx = Document(docx_path)
def get_paragraph_contents(self):
"""提取段落内容和格式信息"""
para_contents = []
for para in self.docx.paragraphs:
if para.text.strip(): # 跳过空段落
# 提取每个文本段的XML信息,包含格式
xml_lst = []
for run in para.runs:
xml_lst.append(run._element.xml)
para_contents.append({
"text": para.text,
"style": para.style.name, # 样式名称(标题、正文等)
"xml": "
".join(xml_lst) # 底层XML,包含格式信息
})
return para_contents
关键点:
- paragraphs:获取所有段落
- runs:同一段落内不同格式的文本段
- style.name:识别标题、正文等样式
2. 表格提取:从Word到JSON的无缝转换
表格数据提取是办公自动化的重点。我们采用Markdown表格作为中间格式,再转换为JSON:
def get_md_tables(self):
"""将Word表格转换为Markdown格式"""
table_md_lst = []
for table in self.docx.tables:
table_content = []
idx = 1
for row in table.rows:
if idx == 2: # 添加Markdown表格分隔行
cell_size = len(row.cells)
table_content.append(f"{'|---' * cell_size}|")
row_data = [cell.text.strip() for cell in row.cells]
table_content.append(f"|{'|'.join(row_data)}|")
idx += 1
table_md_lst.append("
".join(table_content))
return table_md_lst
Markdown表格转JSON的函数:
import json
import re
def markdown_table_to_json(markdown_text: str) -> str:
"""将Markdown表格转换为JSON格式"""
lines = markdown_text.strip().split('
')
lines = [line.strip() for line in lines if line.strip()]
if len(lines) < 2:
return json.dumps([])
# 提取表头
header_line = lines[0]
headers = [h.strip() for h in re.split(r's*|s*', header_line.strip('| '))]
# 提取数据行
data_lines = lines[2:]
result = []
for data_line in data_lines:
cells = [cell.strip() for cell in re.split(r's*|s*', data_line.strip('| '))]
if len(cells) == len(headers):
row_dict = {headers[i]: cells[i] for i in range(len(headers))}
result.append(row_dict)
return json.dumps(result, ensure_ascii=False, indent=2)
这种转换方式的优势:
- 标准化:Markdown是通用的轻量级标记语言
- 可读性:JSON格式便于后续程序处理
- 灵活性:可以轻松转换为CSV、Excel等其他格式
3. 图片提取:挖掘文档中的视觉资产
Word文档本质上是ZIP压缩包,图片存储在特定目录中:
import zipfile
import os
from pathlib import Path
def get_images(self):
"""提取Word文档中的所有图片"""
image_lst = []
docx_path = Path(self.docx_path)
with zipfile.ZipFile(self.docx_path, 'r') as zip_ref:
for file in zip_ref.namelist():
if file.startswith('word/media/'): # 图片存储位置
file_name = os.path.basename(file)
if file_name:
# 保存图片到本地
image_path = os.path.join(
docx_path.parent,
f"{docx_path.stem}_{file_name}"
)
with open(image_path, 'wb') as img_file:
img_file.write(zip_ref.read(file))
image_lst.append(image_path)
return image_lst
三、完整示例:一键处理Word文档
将所有功能整合,创建一个完整的解析器:
if __name__ == '__main__':
# 初始化解析器
parser = DocxParser("你的文档.docx")
print("=== 表格内容 ===")
tables = parser.get_md_tables()
for i, table in enumerate(tables, 1):
print(f"
表格{i} (Markdown格式):")
print(table)
# 转换为JSON
json_data = markdown_table_to_json(table)
print(f"
表格{i} (JSON格式):")
print(json_data)
print("
=== 段落内容 ===")
for para_dict in parser.get_paragraph_contents():
print(f"【{para_dict['style']}】{para_dict['text'][:50]}...")
print("
=== 图片提取 ===")
images = parser.get_images()
for img_path in images:
print(f"已提取: {img_path}")
四、高级技巧与注意事项
1. 处理特殊格式
# 提取超链接
def extract_hyperlinks(self):
hyperlinks = []
for para in self.docx.paragraphs:
for run in para.runs:
if run.hyperlink:
hyperlinks.append({
"text": run.text,
"url": run.hyperlink.target
})
return hyperlinks
# 提取列表
def extract_lists(self):
lists = []
for para in self.docx.paragraphs:
if para.style.name.startswith('List'):
lists.append(para.text)
return lists
2. 批量处理多个文件
import glob
from pathlib import Path
def batch_process(folder_path: str, output_dir: str):
"""批量处理文件夹中的所有Word文档"""
docx_files = glob.glob(f"{folder_path}/*.docx")
for docx_file in docx_files:
print(f"处理: {Path(docx_file).name}")
parser = DocxParser(docx_file)
# 保存提取结果
base_name = Path(docx_file).stem
with open(f"{output_dir}/{base_name}.txt", 'w', encoding='utf-8') as f:
# 写入文字内容
for para in parser.get_paragraph_contents():
f.write(f"{para['text']}
")
# 写入表格
tables = parser.get_md_tables()
for table in tables:
f.write(f"
{table}
")
3. 常见问题解决
问题1:中文乱码
确保使用UTF-8编码读取和保存文件:
with open("output.txt", "w", encoding="utf-8") as f:
f.write(content)
问题2:图片格式不识别
Word可能存储多种图片格式,可以扩展支持的格式:
SUPPORTED_IMAGES = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.emf', '.wmf']
问题3:复杂表格处理
对于合并单元格等复杂表格,可能需要更复杂的处理逻辑,可以结合表格的XML结构进行解析。
五、总结
python-docx为我们打开了一扇自动化处理Word文档的大门。通过简单的Python代码,我们能够:
- 精准提取:不仅获取文本,还能保留格式信息
- 智能转换:将表格转换为结构化的JSON数据
- 资源回收:轻松提取文档中的图片资源
- 批量处理:一次性处理成百上千个文档
办公自动化的核心价值在于释放人力,让计算机处理重复性工作,让人专注于创造性思考。掌握python-docx,你就能将大量手动操作转变为几行代码,真正实现”一次编写,多次运行”。
代码不是魔法,但好的自动化脚本的确 能让工作像魔法一样轻松!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...