一.根据客户需求把文件夹里所有的Word文档转换成Excel格式
Wrod格式如下:
转换后Excel格式如下:
具体要求:word文档中带有5位数字1行转为,序号和方名各1列,后面对应带有【】标签里的内容各1列。如果方名下一行没有含有【】的,数据单独放在备注那1列。有的时候同1个【】内容,会持续两段。需要重新放在一起。
整体思路:带方号的行均保护5位数字,可用正则匹配方号和方名,不包含5位数字的行再次判断是否包含‘【】’,包含‘【】’的行用正则匹配中间的所有字符就是列名,不包含5位数字也不包含‘【】’的行就是需要放备注的内容
实施步骤:
1.导入库
import docx
import os
import re
import pandas as pd
2.收集所有word文件名
#指定word文件存放的文件夹
input_path=os.path.join(os.getcwd(),"word")
#遍历文件夹中所有word文件名
f_lst=os.listdir(input_path)
f_lst
3.生成模板表
#生成模板表和EXCEL列名
cols=["组成","用法","功用","主治","备考","方论","方论选录","方药","功能","功效","加减","禁忌","临床报道","临床举例","实验研究","现代研究","宜忌","异名","制法"]
df=pd.DataFrame({"序号":[],"方名":[]})
moban=df.copy()
moban
4.核心代码
def word2excel(input_path,f_name,df):
#读取word文档
doc = docx.Document(os.path.join(input_path,f_name))
#行计数
count=0
#遍历word文档中所有行
for paragraph in doc.paragraphs:
#判断行是否包含5位数字
if len(re.findall("^[0-9]{5}", paragraph.text))>0:
#正则匹配5位数赋值给变量序号
result = re.findall("[0-9]{5}", paragraph.text)
df.loc[count,"序号"]=result[0]
#正则匹配5位数后面所有字符赋值给变量方名
result2 = re.findall("[0-9]{5}(.*)", paragraph.text)
df.loc[count,"方名"]=result2[0]
#换行
count =1
#print(paragraph.text)
#不包含5位数字的行再次判断是否包含‘【】’
elif len(re.findall("[【](.*)[】]", paragraph.text))>0:
#print(paragraph.text)
#包含‘【】’的行用正则匹配中间的所有字符
result1 = re.findall("[【](.*)[】]", paragraph.text)
#判断是否在列名数组中
if result1[0] in cols:
#正则匹配‘】’后所有字符并写入对应列行
result3 = re.findall("[】](.*)", paragraph.text)
df.loc[count-1,result1[0]]=result3
#不包含5位数字也不包含‘【】’的行
else:
#判断是否为空
if len(paragraph.text)>0:
#写入备注
df.loc[count-1,"备注"]=paragraph.text
#print(paragraph.text)
return df
5.依次对所有文档进行处理并保存
for i in f_lst:
tmp_df=word2excel(input_path,i,moban)
df=pd.concat([df,tmp_df])
df.to_excel("1.xlsx")
二.根据客户需求把txt文档中内容替换成excel中的知道内容
#导入库
import xlrd
def delblankline(infile, outfile):
#打开指定文本文件
infopen = open(infile, 'r', encoding="utf-8")
# 新建指定文本文件
outfopen = open(outfile, 'w', encoding="utf-8")
# 打开指定EXCEL文件
wb = xlrd.open_workbook("2.xlsx")
sh = wb.sheet_by_name("Sheet1")
#查看总行
print(sh.nrows)
#遍历所有行
db = infopen.read()
for i in range(0, sh.nrows):
#得到A、B列数据
name1 = sh.cell(i, 0).value
name2 = sh.cell(i, 1).value
print(name1)
#查找替换数据
db = db.replace(name1, name2)
print(i)
outfopen.write(db)
infopen.close()
outfopen.close()
delblankline("2.txt", "02.txt")
print("完成")