Python提取多个docx文本内容

26 篇文章 0 订阅

使用docx2txt和正则表达式提取多个docx文本内容,并且将结果合并成DataFrame格式。

1. 提取文件路径 & 名称

需要提取文件夹中多个.docx文档,创建cv_list获取所有文件路径,doc_name是文件名,方便之后批量处理。

# 导入工具包
import pandas as pd
import jieba
import docx 
import numpy as np
import re
import zipfile
import os
from bs4 import BeautifulSoup
import docx2txt

#提取文件路径和文件名
cv_list = [] #路径
doc_name = [] #文件名
for i in os.listdir(os.getcwd()):
    a = os.path.splitext(os.getcwd() + "/" + i)#获取当前目录下所有文件的文件名
    if a[1] == '.docx':#如果文件后缀
       cv_list.append(os.getcwd()+"/"+i) 
       doc_name.append(i)
       
#创建表格
df = pd.DataFrame({'文件名':doc_name,'文件地址':cv_list})
df

在这里插入图片描述

2. 文本内容提取

提取文本的基本步骤:
1)首先是通过docx2txt.process()将整篇docx文档转换为txt模式,再使用正则表达式将对应的文本提取出来;
2)使用def将步骤1)打包成函数,用for找出cv_list里的所有文件中的指定内容。
注意: 这种方法适合文档的格式都一致的情况。

文档格式一致的情况

例如:需要提取文档中的年龄资料。

# 查看文档内容 
docx2txt.process('/Users/mac/Documents/python/Noet/003aaaa.docx')

在这里插入图片描述

#提取文档中的年龄内容
def extract_age(filepath):
    text = docx2txt.process(filepath) #提取txt格式的内容
    findword = u"(\d\d+岁)"#定位查询的内容、格式
    pattern = re.compile(findword)
    results = pattern.findall(text)
    return results
    
#提取所有年龄内容
age=[]
for i in cv_list:
    a=extract_age(i)
    age.append(a)
print(age)

在这里插入图片描述
上面的代码,返回的每一个结果都带了[],并且有的是空值
接下来用个if…else…语句将所需要的内容提取出来,并且将空值标成NA

age=[]
for i in cv_list:
    a=extract_age(i)
    if len(a): 
        b=a[0]
    else: 
        b='NA'
    age.append(b)
print(age)

#将内容合并到表格中
df['年龄']=age
df

在这里插入图片描述

文档格式不一致

基于之前的步骤,处理格式不同的文档可以有两种解法:
方法一:提取文本内容后,先格式调整成一样,再提取文本。
方法二:设置不同的格式提取

方法二只适合处理文本格式不复杂,并且不同格式比较少的情况。如果处理的文件格式多样,比如提取简历内容,因为每个人的简历格式不同,批量处理则非常麻烦。

这个例子里,从网上取了两个不同的简历模版,虽然主体内容大致相同,都是年龄、工作经历等信息,但是由于格式不一样,提取所需的文字就比较复杂。比如左边aaaa文档的时间格式是YYYY.MM, 而另一个为YYYY/MM

文档aaaa文档
在这里插入图片描述在这里插入图片描述
#提取文档aaaa的教育经历
def extract_eduZ(filepath):
    text = docx2txt.process(filepath)
    
    #删除时间符号
    datepat=re.compile(r'\t(\d+).(\d+)')
    str=datepat.sub(r'\1/\2',text)
    datepat=re.compile(r'(\d+).(\d+)')
    str=datepat.sub(r'\1/\2',str) 
    
    #删空格 
    str = re.sub("[ ]", "", str) 
    
    result=re.findall( "教育经历\n\n\d\d\d\d/\d+-(.+?)\xa0\xa0", str, re.S)
    return result

#提取格式为YYYY/M的时间
def extract_edu(filepath):
    text = docx2txt.process(filepath)
    results=re.findall( "教育经历\n\n\d\d\d\d/\d+-(.+?)\n\n", text, re.S) 
    return results

# 提取所有文件的内容
eduA=[]
for i in cv_list:
    
    #第一个if 用来更换查找格式
    if 'aaaa' in i:  #找出路径名称里有‘aaaa'的文件
        a= extract_eduZ(i)
    else: 
        a=extract_edu(i)
     
    #第二个if转换结果内容
    if len(a): 
        b=a[0]
    else: 
        b='NA'
        
    eduA.append(b)
print(eduA)

# 合并并查看结果
df['时间']=eduA
df

在这里插入图片描述

3. 总结

主要难点:

  • 不同格式文档的处理
  • 正则表达式的应用。
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值