数据示例:
文件内容分为两部分,一种为表格形式
Word中的第一个表格
一种为文本段落形式
Word文件中需要结构化处理的内容
需求:
将表格中文本进行提取,第一列为字段名,第二列为数据内容
将段落中的内容按照符号【字段】内容 对应关系转为表格
处理步骤:
from docx import Document
import pandas as pd
path = "./data/保健食品备案/食健备G201845001742.docx"
docx = Document(path)
表格处理
table=table_s[0]
dic_data={}
for i in range(0,len(table.rows)):
title=table.cell(i, 0).text
data=table.cell(i, 1).text
dic_data[title]=data
文本处理
pattern = re.compile(r'\d+年\d+月\d+日') # 查找日期
for page in pages:
print(page.text)
if pattern.match(page.text):
break
正则日期匹配
# 正则表达式
line='''【原料】醋酸视黄酯,维生素D3,维生素K2 (发酵法),D-α-生育酚【辅料】大豆油,明胶,纯化水,甘油,焦糖色,二氧化钛,玉米油,拧檬黄铝色淀, 二丁基羟基甲苯(BHT)【功效成分及含量】每粒含:维生素A 223.0μg维生素D3 8.4μg维生素K2 34.0μg 维生素 E 5.0mg【适宜人群】需要补充多种维生素的4-17岁人群【不适宜人群】3岁以下人群及孕妇、乳母【保健功能】补充多种维生素【食用量及食用方法】每日1次,每次1粒,食用方法:口服 【规格】0.5 g/粒【贮藏方法】密封,置阴凉干燥处【保质期】24个月【注意事项】本品不能代替药物。适宜人群外的人群不推荐食用本产品。 不宜超过推荐量或与同类营养素同时食用'''
pattern = re.compile(r'(【.+?】)([^】【]+)') # 正则
result1 = pattern.findall(line)
result1
正则提取字段与内容
# 解析文本
pages = docx.paragraphs
# 获取日期
def get_date(pages):
pattern = re.compile(r'\d+年\d+月\d+日') # 查找数字
for page in pages:
if pattern.match(page.text):
break
return page.text
dic_data['日期']=get_date(pages)
# 判断文本范围
def get_num(pages):
num=0
for page in pages:
if page.text=='附件2':
break
else:
num=num+1
return num
t=[]
for i in pages[1:get_num(pages)]:
t.append(i.text)
line=''.join(t) # 得到长文本
pattern = re.compile(r'(【.+?】)([^】【]+)') # 正则
result = pattern.findall(line)
for j in result:
dic_data[j[0]]=j[1]
单个文件处理函数封装
def Word_Extract_Contents(path):
# 解析第一个表格
docx = Document(path)
table_s = docx.tables
table=table_s[0]
dic_data={}
for i in range(0,len(table.rows)):
title=table.cell(i, 0).text
data=table.cell(i, 1).text
dic_data[title]=data
# 解析文本
pages = docx.paragraphs
# 获取日期
def get_date(pages):
pattern = re.compile(r'\d+年\d+月\d+日') # 查找数字
for page in pages:
if pattern.match(page.text):
break
return page.text
dic_data['日期']=get_date(pages)
# 判断文本范围
def get_num(pages):
num=0
for page in pages:
if page.text=='附件2':
break
else:
num=num+1
return num
t=[]
for i in pages[1:get_num(pages)]:
t.append(i.text)
line=''.join(t) # 得到长文本
pattern = re.compile(r'(【.+?】)([^】【]+)') # 正则
result = pattern.findall(line)
for j in result:
dic_data[j[0]]=j[1]
df=pd.DataFrame([dic_data])
return df
获取文件夹文件目录
# 获取文件夹中的文件目录
import os
paths=os.listdir('./data/保健食品备案')
数据处理与汇总
df0=pd.DataFrame()
for path in paths:
df=Word_Extract_Contents('./data/保健食品备案/{}'.format(path))
print(type(df))
df0=pd.concat([df0,df],axis=0)
数据保存
df0.to_excel('./data/保健食品备案2021.07.13.xlsx',index=False)
处理结果
Excel结果
|