Python自动化处理Word表格简历:从docx结构解析到批量导出Excel
本文介绍如何利用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'。
该错误通常是因为文件句柄未正确关闭导致。确保在操作完成后关闭文件对象,即可解决此权限问题。
以上为个人实践经验总结,旨在为读者提供参考。如有疏漏或未尽之处,欢迎指正与讨论。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









