Python自动化处理Word表格简历:从docx结构解析到批量导出Excel

青禾
青禾
发布时间:2026-10-14| 6人浏览过
原创

本文介绍如何利用Python自动处理大量Word表格简历。通过解析docx文件内部的zip结构和document.xml,结合正则表达式提取姓名、学历等关键字段,并批量写入txt或Excel文件。文章提供完整代码示例及常见权限错误解决方案,帮助开发者高效完成数据整理任务。

前言

近期,一位朋友向我咨询一个办公自动化难题:他的上司要求将数百份Word格式的表格简历信息整理汇总到Excel中。面对手动复制粘贴姓名、年龄等大量重复劳动,这位职场新人虽感无奈,但出于职责所在,只能寻求技术帮助。我建议尝试使用Python脚本解决此类问题,该方法不仅操作简单,而且易于上手,能显著提高工作效率。

核心思路:针对每一份Word表格文档进行独立分析与数据提取。

最初的想法是将Word表格转换为网页格式,利用多年爬虫经验,通过正则表达式解析网页获取信息似乎是一条可行路径。然而,考虑到需手动将数百个文件逐一转换,这依然涉及大量人工操作,违背了自动化的初衷。经过深入调研,我发现.docx文件本质上是一个ZIP压缩包。解压后,内部包含一个专门存储文本内容的XML文件,这为直接读取数据提供了便利。

在解压后的文件结构中,关键信息存储在名为document.xml的文件中,所有我们需要的数据均隐藏于此。

基于上述发现,处理流程可以明确为以下步骤:

第一步,使用Python打开.docx文件对应的ZIP压缩包。

第二步,从压缩包中提取word目录下的正文信息文件。

第三步,利用正则表达式对提取的文本进行匹配,筛选出目标字段。

第四步,将匹配到的结构化信息保存为txt格式文件(该格式可直接被Excel识别打开)。

第五步,通过循环批量调用上述处理流程,实现一万份简历数据的自动化提取。

第六步,对提取结果进行校验,检查是否存在数据缺失或格式错误。

0x01 获取docx信息

本阶段主要利用Python标准库中的zipfile和re模块,直接读取docx压缩包内的document.xml文件内容,并去除XML标签以获取纯文本。


import zipfile
import re
def get_document(filepath):
  z = zipfile.ZipFile(filepath, "r")
  text = z.read("word/document.xml").decode("UTF-8")
  text = re.sub(r"<.*?>", "", text)#去除xml里的所有标记符
  ###如果多份简历在同一个word文件里###
  #table_list = text.split("XX简历")[1:]#依据简历标题切分每一份简历信息
  #return table_list
  return text

通过打印处理后的text变量,可以验证提取结果。

至此,已成功从Word文档中提取出简历中的全部相关文本信息。

0x02 抓取各字段值

在获取纯文本后,下一步是根据预定义的字段规则,使用正则表达式精准抓取姓名、性别、学历等具体字段值。


import re
def get_field_value(text):
  value_list = []
  m = re.findall(r"姓 名(.*?)性  别", table)
  value_list.append(m)
  m = re.findall(r"性  别(.*?)学  历", table)
  value_list.append(m)
  m = re.findall(r"民 族(.*?)健康状况", table)
  value_list.append(m)  
  '''
  此处省略其他字段匹配
  '''
  return value_list

最终,每个字段匹配到的内容将以列表形式返回,便于后续存储和处理。

0x03 将内容写入到文件

接下来,将包含各字段值的列表转换为字符串格式,并写入到txt文件中。


str1 = ""
for value in value_list:
  str1 = str1 + str(value[0]) + "\t"#每个字段值用制表符\t分隔
str1 = str1 + "\n"
with open("result.txt", "a+") as f:#将内容以追加形式写入到result.txt中
  f.write(str1)

上述步骤实现了单个Word文档向txt文件的转换。

若需处理多个文件,只需对该目录下的所有文件执行批量处理即可。

0x04 批量处理完整代码

以下是实现上述逻辑的完整Python代码示例。


import re
import zipfile
import os
def get_document(filepath):
  z = zipfile.ZipFile(filepath, "r")
  text = z.read("word/document.xml").decode("UTF-8")
  text = re.sub(r"<.*?>", "", text)#去除xml里的所有标记符
  ###如果多份简历在同一个word文件里###
  table_list = text.split("XX简历")[1:]#依据简历标题切分每一份简历信息
  return table_list
def get_field_value(text):
  value_list = []
  m = re.findall(r"姓 名(.*?)性  别", table)
  value_list.append(m)
  m = re.findall(r"性  别(.*?)学  历", table)
  value_list.append(m)
  m = re.findall(r"民 族(.*?)健康状况", table)
  value_list.append(m)  
  '''
  此处省略其他字段匹配
  '''
  return value_list
cv_list = []
for i in os.listdir(os.getcwd()):
  a = os.path.splitext(os.getcwd() + "\\" + i)#获取当前目录下所有文件的文件名
  if a[1] == '.docx':#如果文件后缀
    print(os.getcwd()+"\\"+i)
    cv_list = cv_list + get_document(os.getcwd() + "\\" + i)#每份简历信息为一个列表元素
for i in cv_list:
  value_list = get_field_value(i)
  str1 = ""
  for value in value_list:
    str1 = str1 + str(value[0]) + "\t"
  str1 = str1 + "\n"
  with open("result.txt", "a+") as f:
    f.write(str1)

执行完毕后,一万份Word表格简历信息将被转换为txt文件,用户可直接使用Excel打开该txt文件进行查看或进一步处理。

补充:Python操作Word表格的一些技巧

数据格式说明:datas变量通常表现为列表套列表的结构,用于存储多维数据。


aa =[ [1,2,3,4,5],[6,7,8,9],[]…]

import os
import requests
import json
import datetime
from docx import Document
from docx.shared import Inches, Pt, Cm
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def create_insert_word_table(datas, stday, etday, s):
  """创建word表格以及插入数据"""
  doc = Document()
  doc.styles['Normal'].font.name = 'Calibri' # 是用来设置当文字是西文时的字体,
  doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 是用来设置当文字是中文时的字体
  # doc.styles['Normal'].font.size = Pt(14) # 设置所有文字字体大小为14
  distance = Inches(0.5)
  sec = doc.sections[0] # sections对应文档中的“节”
  sec.left_margin = distance # 以下依次设置左、右、上、下页面边距
  sec.right_margin = distance
  sec.top_margin = distance
  sec.bottom_margin = distance
  sec.page_width = Inches(11.7) # 设置页面宽度
  # sec.page_height = Inches(9) # 设置页面高度
  # doc.add_heading() # 设置标题,但是不符合我的条件,只能试用下方p.add_run('我是文字')
  p = doc.add_paragraph() # 添加段落
  p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置中央对齐
  run = p.add_run('我是文字')
  run.font.size = Pt(22)
  doc.add_paragraph() # 添加空段落
  # 添加表格
  table = doc.add_table(rows=1, cols=10, style='Table Grid')
  table.style.name = 'Table Grid'
  table.style.font.size = Pt(14)
  table.rows[0].height = Cm(20)
  title = table.rows[0].cells
  title[0].text = '姓名'
  title[1].text = '1'
  title[2].text = '2'
  title[3].text = '3'
  title[4].text = '4'
  title[5].text = '5'
  title[6].text = '6 '
  title[7].text = '7'
  title[8].text = '8'
  title[9].text = '9'
  for i in range(len(datas)):
    cels = table.add_row().cells
    for j in range(len(datas[i])):
      # cels[j].text = str(datas[i][j])
      p = cels[j].paragraphs[0]
      p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置中央对齐
      p.add_run(str(datas[i][j]))
      ph_format = p.paragraph_format
      # ph_format.space_before = Pt(10) # 设置段前间距
      # ph_format.space_after = Pt(12) # 设置段后间距
      ph_format.line_spacing = Pt(40) # 设置行间距
  doc.save('./files/项目总结.docx')

生成示例:展示如何构建示例数据结构。

可能遇到的错误:[Errno 13] Permission denied: ‘./files/项目进展总结.docx'。

该错误通常是因为文件句柄未正确关闭导致。确保在操作完成后关闭文件对象,即可解决此权限问题。

以上为个人实践经验总结,旨在为读者提供参考。如有疏漏或未尽之处,欢迎指正与讨论。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。