批量识别医疗票据【第1版】
批量识别医疗票据
目录
【过程代码】主要讲学习和探索过程
【最终代码】直接可用
1. 文本识别
1.1 挑选数据
因为数据格式不统一,因此需要手工筛选可用数据:
- 搜索images_1,从3044个文件中挑选出合格文件97个,其余删去;
- 搜索images_2,从607个文件中删除出不合格文件94个,其余保留;
- 搜索images_3,从93个文件中挑选出合格文件103个,其余删去;
- 搜索images_4,保留合格文件1个;
最终以4078个pdf文件为基础,从生成的7892个图片中筛选出4719个,作为后续识别用。
1.2 数据预处理
将上述4725个图片分别放入48个文件夹,每个文件夹中最多放100个图像,具体原因见1.3。
1.3 文字识别
基于百度智能云的图文转换器进行文字识别,每次只能上传100个数据。
因此共进行48次识别任务,完成后得到48个压缩包。
因短时间内不便探索文字识别,故采用1.2和1.3中的低效重复劳动,未来须改进。
1.4 批量解压
参考python 批量解压zip文件到指定目录后的【最终代码】
import os
import zipfile
# 解压
def del_old_zip(file_name):
os.remove(file_name)
def unzip(file_path, root):
# file_path 为zip文件的全路径
# root 为解压后的路径
zip_name = os.listdir(file_path) # 获取路径下的所有文件
for name in zip_name:
zip_file = os.path.join(file_path, str(name)) # 拼接文件的全名
if zip_file.endswith(".zip"):
# 判断文件的结尾是否为zip结尾
fz = zipfile.ZipFile(zip_file, "r")
for file in fz.namelist():
fz.extract(file, root)
fz.close()
# 删除文件 # 可选的
del_old_zip(zip_file)
else:
print(fr"{zip_file} this is not zip")
if __name__ == "__main__":
parent_path = r"C:\Users\Administrator\Desktop\fyo"
unfile = r"C:\Users\Administrator\Desktop\fyo"
unzip(parent_path, unfile)
测试成功,可一次性将所有压缩包解压。
2. 转换格式
2.1 测试
1.4解压缩之后得到4725个xlsx文件。由于xlrd包不能读取上文中生成的xlsx格式,因此需要先将其统一转换为xls格式。
参考python实现xlsx批量转xls后的【最终代码】
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import time
import os
import win32com.client as win32
inputdir = u'C:\\Users\\Administrator\\Desktop\\20221018_Recognition\\xlsx'
# 输出目录
outputdir = u'C:\\Users\\Administrator\\Desktop\\20221018_Recognition\\xlsx\\xls'
if not os.path.exists(outputdir):
os.mkdir(outputdir)
i = 0
# 三个参数:父目录;所有文件夹名(不含路径);所有文件名
for parent, dirnames, filenames in os.walk(inputdir):
for fn in filenames:
i += 1
print(i)
if fn.split('.')[-1] == "xlsx":
# time.sleep(0.2)
filedir = os.path.join(parent, fn)
print(filedir)
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(filedir)
# xlsx: FileFormat=51
# xls: FileFormat=56
wb.SaveAs((os.path.join(outputdir, fn.replace('xlsx', 'xls'))), FileFormat=56)
wb.Close()
excel.Application.Quit()
# 测试单个xlsx转换xls是否成功
# excel = pd.read_excel(r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls\231.xls')
print("完成转换!!!")
测试成功,可一次性将所有xlsx格式的文件转换为xls格式。
2.2 调整
运行大批量数据时中途会发生报错,调整为每次转换500个xlsx文件。
过程中发现,报错、中断的原因是少数xlsx文件需要打开手动进行修复,完成后即可正常运行程序。
3. 单个xls文件内容处理
得到各个文件识别过后的单个excel文件,还得根据需要的格式进行统一的合并
3.1 单个文本提取文本片段
从单个excel提取所有文本的【过程代码】
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
data = pd.read_excel(r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls\231.xls')
# 病例的前4个重要信息
print(data.iloc[0, 0])
print(data.iloc[2, 0])
print(data.iloc[4, 0])
print(data.iloc[6, 0])
# 病例的诊断数据
XiJun_BingYuanTi = data.iloc[10, 1] # 细菌_病原体
XiJun_XuLieShu = data.iloc[10, 2] # 细菌_序列数
XiJun_XiangDuiFengDu = data.iloc[10, 3] # 细菌_相对丰度%
ZhenJun_BingYuanTi = data.iloc[11, 1] # 真菌_病原体
ZhenJun_XuLieShu = data.iloc[11, 2] # 真菌_序列数
ZhenJun_XiangDuiFengDu = data.iloc[11, 3] # 真菌_相对丰度%
BingDu_BingYuanTi = data.iloc[12, 1] # 病毒_病原体
BingDu_XuLieShu = data.iloc[12, 2] # 病毒_序列数
BingDu_XiangDuiFengDu = data.iloc[12, 3] # 病毒_相对丰度%
JiShengChong_BingYuanTi = data.iloc[13, 1] # 寄生虫_病原体
JiShengChong_XuLieShu = data.iloc[13, 2] # 寄生虫_序列数
JiShengChong_XiangDuiFengDu = data.iloc[13, 3] # 寄生虫_相对丰度%
TeShuBingYuanTi_BingYuanTi = data.iloc[14, 1] # 特殊病原体_病原体
TeShuBingYuanTi_XuLieShu = data.iloc[14, 2] # 特殊病原体_序列数
TeShuBingYuanTi_XiangDuiFengDu = data.iloc[14, 3] # 特殊病原体_相对丰度%
RenTiWeiShengTaiJunQun_BingYuanTi = data.iloc[15, 1] # 人体微生态菌群_病原体
RenTiWeiShengTaiJunQun_XuLieShu = data.iloc[15, 2] # 人体微生态菌群_序列数
RenTiWeiShengTaiJunQun_XiangDuiFengDu = data.iloc[15, 3] # 人体微生态菌群_相对丰度%
# 结果解释
print(data.iloc[17, 0])
测试成功
注意,病原体和序列号没有隔开
3.2 单个文本读取后,写进特定文本
参考如何使用Python给Excel写入数据后的【过程代码】
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
from openpyxl import load_workbook
data = pd.read_excel(r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls\231.xls')
# 加载excel,注意路径要与脚本一致
wb = load_workbook(r'C:\Users\Administrator\Desktop\样表.xlsx')
#激活excel表
sheet = wb.active
#向excel中写入对应的value
sheet.cell(row=4, column=1).value = data.iloc[0, 0] # 信息1
sheet.cell(row=4, column=2).value = data.iloc[2, 0] # 信息2
sheet.cell(row=4, column=3).value = data.iloc[4, 0] # 信息3
sheet.cell(row=4, column=4).value = data.iloc[6, 0] # 信息4
sheet.cell(row=4, column=5).value = data.iloc[10, 1] # 细菌_病原体
sheet.cell(row=4, column=6).value = data.iloc[10, 2] # 细菌_序列数
sheet.cell(row=4, column=7).value = data.iloc[10, 3] # 细菌_相对丰度%
sheet.cell(row=4, column=8).value = data.iloc[11, 1] # 真菌_病原体
sheet.cell(row=4, column=9).value = data.iloc[11, 2] # 真菌_序列数
sheet.cell(row=4, column=10).value = data.iloc[11, 3] # 真菌_相对丰度%
sheet.cell(row=4, column=11).value = data.iloc[12, 1] # 病毒_病原体
sheet.cell(row=4, column=12).value = data.iloc[12, 2] # 病毒_序列数
sheet.cell(row=4, column=13).value = data.iloc[12, 3] # 病毒_相对丰度%
sheet.cell(row=4, column=14).value = data.iloc[13, 1] # 寄生虫_病原体
sheet.cell(row=4, column=15).value = data.iloc[13, 2] # 寄生虫_序列数
sheet.cell(row=4, column=16).value = data.iloc[13, 3] # 寄生虫_相对丰度%
sheet.cell(row=4, column=17).value = data.iloc[14, 1] # 特殊病原体_病原体
sheet.cell(row=4, column=18).value = data.iloc[14, 2] # 特殊病原体_序列数
sheet.cell(row=4, column=19).value = data.iloc[14, 3] # 特殊病原体_相对丰度%
sheet.cell(row=4, column=20).value = data.iloc[15, 1] # 人体微生态菌群_病原体
sheet.cell(row=4, column=21).value = data.iloc[15, 2] # 人体微生态菌群_序列数
sheet.cell(row=4, column=22).value = data.iloc[15, 3] # 人体微生态菌群_相对丰度%
sheet.cell(row=4, column=23).value = data.iloc[17, 0] # 结果解释
wb.save(r'C:\Users\Administrator\Desktop\样表.xlsx')
print('数据写入成功!')
测试成功,能够从指定excel读取文本、然后写进另一个指定excel。
注意,病原体和序列号没有隔开
4. 批量处理Excel
4.1 测试
参考python批量读取Excel文件后的【过程代码】
# -*- coding:utf-8 -*-
import numpy as np
import os
import pandas as pd
from openpyxl import load_workbook
# path = r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls'
path = r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\fyo'
# data = pd.read_excel(r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls\231.xls')
# 加载excel,注意路径要与脚本一致
wb = load_workbook(r'C:\Users\Administrator\Desktop\样表.xlsx')
#激活excel表
sheet = wb.active
j = 2
for i in os.listdir(path):
j += 1
data = pd.read_excel(os.path.join(path, i))
print("准备开始处理第 ", j - 2, " 个单据,单据名称是: ", i)
#向excel中写入对应的value
sheet.cell(row=j, column=1).value = j - 2 # 序号
sheet.cell(row=j, column=2).value = i # 单据名称
sheet.cell(row=j, column=3).value = data.iloc[0, 0] # 信息1
sheet.cell(row=j, column=4).value = data.iloc[2, 0] # 信息2
sheet.cell(row=j, column=5).value = data.iloc[4, 0] # 信息3
sheet.cell(row=j, column=6).value = data.iloc[6, 0] # 信息4
sheet.cell(row=j, column=7).value = data.iloc[10, 1] # 细菌_病原体
sheet.cell(row=j, column=8).value = data.iloc[10, 2] # 细菌_序列数
sheet.cell(row=j, column=9).value = data.iloc[10, 3] # 细菌_相对丰度%
sheet.cell(row=j, column=10).value = data.iloc[11, 1] # 真菌_病原体
sheet.cell(row=j, column=11).value = data.iloc[11, 2] # 真菌_序列数
sheet.cell(row=j, column=12).value = data.iloc[11, 3] # 真菌_相对丰度%
sheet.cell(row=j, column=13).value = data.iloc[12, 1] # 病毒_病原体
sheet.cell(row=j, column=14).value = data.iloc[12, 2] # 病毒_序列数
sheet.cell(row=j, column=15).value = data.iloc[12, 3] # 病毒_相对丰度%
sheet.cell(row=j, column=16).value = data.iloc[13, 1] # 寄生虫_病原体
sheet.cell(row=j, column=17).value = data.iloc[13, 2] # 寄生虫_序列数
sheet.cell(row=j, column=18).value = data.iloc[13, 3] # 寄生虫_相对丰度%
sheet.cell(row=j, column=19).value = data.iloc[14, 1] # 特殊病原体_病原体
sheet.cell(row=j, column=20).value = data.iloc[14, 2] # 特殊病原体_序列数
sheet.cell(row=j, column=21).value = data.iloc[14, 3] # 特殊病原体_相对丰度%
sheet.cell(row=j, column=22).value = data.iloc[15, 1] # 人体微生态菌群_病原体
sheet.cell(row=j, column=23).value = data.iloc[15, 2] # 人体微生态菌群_序列数
sheet.cell(row=j, column=24).value = data.iloc[15, 3] # 人体微生态菌群_相对丰度%
sheet.cell(row=j, column=25).value = data.iloc[17, 0] # 结果解释
wb.save(r'C:\Users\Administrator\Desktop\样表.xlsx')
print('数据写入成功!')
运行成功,证明如果所有文件格式统一,则可有效运行。
部分excel文件不能运行,需要单独拎出来
4.2 改进
参考python 移动文件
参考Python异常处理
参考python获取系统当前时间
【最终代码】
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
import os
import shutil
import datetime
import pandas as pd
from openpyxl import load_workbook
time_start = datetime.datetime.now() # 记录开始时间
path = r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls'
new_path = r"C:\Users\Administrator\Desktop\fyo"
wb = load_workbook(r'C:\Users\Administrator\Desktop\样表.xlsx') # 加载excel,注意路径要与脚本一致
sheet = wb.active # 激活excel表
j = 2
for i in os.listdir(path):
j += 1
data = pd.read_excel(os.path.join(path, i))
try:
print("")
print("准备开始处理第 ", j - 2, " 个单据,单据名称是: ", i)
# 向excel中写入对应的value
sheet.cell(row=j, column=1).value = j - 2 # 序号
sheet.cell(row=j, column=2).value = i # 单据名称
sheet.cell(row=j, column=3).value = data.iloc[0, 0] # 信息1
sheet.cell(row=j, column=4).value = data.iloc[2, 0] # 信息2
sheet.cell(row=j, column=5).value = data.iloc[4, 0] # 信息3
sheet.cell(row=j, column=6).value = data.iloc[6, 0] # 信息4
sheet.cell(row=j, column=7).value = data.iloc[10, 1] # 细菌_病原体
sheet.cell(row=j, column=8).value = data.iloc[10, 2] # 细菌_序列数
sheet.cell(row=j, column=9).value = data.iloc[10, 3] # 细菌_相对丰度%
sheet.cell(row=j, column=10).value = data.iloc[11, 1] # 真菌_病原体
sheet.cell(row=j, column=11).value = data.iloc[11, 2] # 真菌_序列数
sheet.cell(row=j, column=12).value = data.iloc[11, 3] # 真菌_相对丰度%
sheet.cell(row=j, column=13).value = data.iloc[12, 1] # 病毒_病原体
sheet.cell(row=j, column=14).value = data.iloc[12, 2] # 病毒_序列数
sheet.cell(row=j, column=15).value = data.iloc[12, 3] # 病毒_相对丰度%
sheet.cell(row=j, column=16).value = data.iloc[13, 1] # 寄生虫_病原体
sheet.cell(row=j, column=17).value = data.iloc[13, 2] # 寄生虫_序列数
sheet.cell(row=j, column=18).value = data.iloc[13, 3] # 寄生虫_相对丰度%
sheet.cell(row=j, column=19).value = data.iloc[14, 1] # 特殊病原体_病原体
sheet.cell(row=j, column=20).value = data.iloc[14, 2] # 特殊病原体_序列数
sheet.cell(row=j, column=21).value = data.iloc[14, 3] # 特殊病原体_相对丰度%
sheet.cell(row=j, column=22).value = data.iloc[15, 1] # 人体微生态菌群_病原体
sheet.cell(row=j, column=23).value = data.iloc[15, 2] # 人体微生态菌群_序列数
sheet.cell(row=j, column=24).value = data.iloc[15, 3] # 人体微生态菌群_相对丰度%
sheet.cell(row=j, column=25).value = data.iloc[17, 0] # 结果解释
sheet.cell(row=j, column=26).value = "可用" # 结果解释
wb.save(r'C:\Users\Administrator\Desktop\样表.xlsx')
except:
print(" 不能执行,需要跳过该文件: ", i)
src = os.path.join(path, i)
dst = os.path.join(new_path, i)
shutil.move(src, dst)
print(" 文件转移成功: ", i)
sheet.cell(row=j, column=26).value = "不可用" # 结果解释
pass
if j % 20 == 0: # 每隔20组数据,输出一次时间
print("")
print(datetime.datetime.now())
print("")
print("")
print("")
print('数据写入成功!')
print("开始时间: ", time_start)
print("结束时间: ", datetime.datetime.now())
5. 查找excel中的重复数据
Python 进行excel查重
python 查找excel表格中重复的信息并标出来
6. 2022-10-22代码改进
# -*- coding:utf-8 -*-
import os
import re
import shutil
import datetime
import pandas as pd
from openpyxl import load_workbook
k = 0 # 第k个样本数据
j = 3 # 填写数据时的行数
time_start = datetime.datetime.now() # 记录开始时间
path = r'C:\Users\Administrator\Desktop\20221018_Recognition\xlsx\xls'
# path = r'C:\Users\Administrator\Desktop\267'
new_path = r"C:\Users\Administrator\Desktop\fyo"
wb = load_workbook(r'C:\Users\Administrator\Desktop\样表.xlsx') # 加载excel,注意路径要与脚本一致
sheet = wb.active # 激活excel表
for i in os.listdir(path): # 遍历目录下的每一个文件
try:
print("")
k += 1
print("准备开始处理第 ", k, " 个单据,单据名称是: ", i)
data = pd.read_excel(os.path.join(path, i)) # 读取目录下的每一个文件
beizhu = [] # 记录出现”备注“的次数,并挑出最小的一次,用于筛选前缀信息
xj= [] # 细菌
zj = [] # 真菌
bd = [] # 病毒
jsc = [] # 寄生虫
tsbyt = [] # 特殊病原体
rtwstjq = [] # 人体微生态菌群
jgjs = [] # 结果解释
# 向excel中写入对应的value
sheet.cell(row=j, column=1).value = k # 序号
sheet.cell(row=j, column=2).value = i # 单据名称
sheet.cell(row=j, column=3).value = data.iloc[0, 0] # 信息1
for hang in range(len(data.iloc[:, 0])):
if type(data.iloc[hang, 0]) is not float:
if "备注" in data.iloc[hang, 0]:
beizhu.append(hang)
BeiZhu = min(beizhu) # 找到"备注"的行数
# 与上一个循环不可合并,以避免诊断里面出现病原体类型
for hang in range(BeiZhu+1, len(data.iloc[:, 0])):
if type(data.iloc[hang, 0]) is not float:
if "细菌" in data.iloc[hang, 0]:
xj.append(hang)
if "真菌" in data.iloc[hang, 0]:
zj.append(hang)
if "病毒" in data.iloc[hang, 0]:
bd.append(hang)
if "寄生虫" in data.iloc[hang, 0]:
jsc.append(hang)
if "特殊病原体" in data.iloc[hang, 0]:
tsbyt.append(hang)
if "人体微生态菌群" in data.iloc[hang, 0]:
rtwstjq.append(hang)
if "结果解释" in data.iloc[hang, 0]:
jgjs.append(hang)
dayinxishu = 1 # 打印系数
for hang in range(1, BeiZhu+1): # 从信息2开始填写
if data.iloc[hang, 0] not in data.iloc[hang - 1, 0]:
sheet.cell(row=j, column=3 + dayinxishu).value = data.iloc[hang, 0]
dayinxishu += 1
XJ = min(xj) # 找到"细菌"的行数
ZJ = min(zj) # 找到"真菌"的行数
BD = min(bd) # 找到"病毒"的行数
JSC = min(jsc) # 找到"寄生虫"的行数
TSBYT = min(tsbyt) # 找到"特殊病原体"的行数
RTWSTJQ = min(rtwstjq) # 找到"人体微生态菌群"的行数
JGJS = min(jgjs) # 找到"结果解释"的行数
sheet.cell(row=j, column=7).value = "成功" # 说明该数据是否可用
for hang in range(ZJ - XJ): # 可能有多行的细菌数据,需要逐条列出
sheet.cell(row=j + hang, column=8).value = data.iloc[XJ + hang, 1] # 细菌_病原体
sheet.cell(row=j + hang, column=9).value = data.iloc[XJ + hang, 2] # 细菌_序列数
sheet.cell(row=j + hang, column=10).value = data.iloc[XJ + hang, 3] # 细菌_相对丰度%
# print("ZJ - XJ")
for hang in range(BD - ZJ): # 可能有多行的真菌数据,需要逐条列出
sheet.cell(row=j + hang, column=11).value = data.iloc[ZJ + hang, 1] # 真菌_病原体
sheet.cell(row=j + hang, column=12).value = data.iloc[ZJ + hang, 2] # 真菌_序列数
sheet.cell(row=j + hang, column=13).value = data.iloc[ZJ + hang, 3] # 真菌_相对丰度%
# print("BD - ZJ")
for hang in range(JSC - BD): # 可能有多行的病毒数据,需要逐条列出
sheet.cell(row=j + hang, column=14).value = data.iloc[BD + hang, 1] # 病毒_病原体
sheet.cell(row=j + hang, column=15).value = data.iloc[BD + hang, 2] # 病毒_序列数
sheet.cell(row=j + hang, column=16).value = data.iloc[BD + hang, 3] # 病毒_相对丰度%
# print("JSC - BD")
for hang in range(TSBYT - JSC): # 可能有多行的寄生虫数据,需要逐条列出
sheet.cell(row=j + hang, column=17).value = data.iloc[JSC + hang, 1] # 寄生虫_病原体
sheet.cell(row=j + hang, column=18).value = data.iloc[JSC + hang, 2] # 寄生虫_序列数
sheet.cell(row=j + hang, column=19).value = data.iloc[JSC + hang, 3] # 寄生虫_相对丰度%
# print("TSBYT - JSC")
for hang in range(RTWSTJQ - TSBYT): # 可能有多行的特殊病原体数据,需要逐条列出
sheet.cell(row=j + hang, column=20).value = data.iloc[TSBYT + hang, 1] # 特殊病原体_病原体
sheet.cell(row=j + hang, column=21).value = data.iloc[TSBYT + hang, 2] # 特殊病原体_序列数
sheet.cell(row=j + hang, column=22).value = data.iloc[TSBYT + hang, 3] # 特殊病原体_相对丰度%
# print("RTWSTJQ - TSBYT")
for hang in range(JGJS - RTWSTJQ): # 可能有多行的人体微生态菌群数据,需要逐条列出
sheet.cell(row=j + hang, column=23).value = data.iloc[RTWSTJQ + hang, 1] # 人体微生态菌群_病原体
sheet.cell(row=j + hang, column=24).value = data.iloc[RTWSTJQ + hang, 2] # 人体微生态菌群_序列数
sheet.cell(row=j + hang, column=25).value = data.iloc[RTWSTJQ + hang, 3] # 人体微生态菌群_相对丰度%
# print("JGJS - RTWSTJQ")
sheet.cell(row=j, column=26).value = data.iloc[JGJS+1, 0] # 结果解释
# 根据数据情况来调整当前样本和下一样本之间的空行
j += max(ZJ - XJ, BD - ZJ, JSC - BD, TSBYT - JSC, RTWSTJQ - TSBYT, JGJS - RTWSTJQ)
wb.save(r'C:\Users\Administrator\Desktop\样表.xlsx')
except:
print(" 不能执行,需要跳过该文件,并转移: ", i)
src = os.path.join(path, i)
dst = os.path.join(new_path, i)
shutil.move(src, dst)
print(" 文件转移成功: ", i)
sheet.cell(row=j, column=7).value = "失败" # 结果解释
j += 1
wb.save(r'C:\Users\Administrator\Desktop\样表.xlsx')
pass
if j % 20 == 0: # 每隔20组数据,输出一次时间
print("")
print(datetime.datetime.now())
print("")
print("")
print('数据写入成功!')
print("开始时间: ", time_start)
print("结束时间: ", datetime.datetime.now())
更多推荐
所有评论(0)