美国usan数据库——PDF提取
QQ:231469242 原创
单个PDF内容提取

# -*- coding: utf-8 -*-
"""
io.open() is the preferred, higher-level interface to file I/O. It wraps the OS-level file descriptor in an object that you can use to access the file in a Pythonic manner.
os.open() is just a wrapper for the lower-level POSIX syscall. It takes less symbolic (and more POSIX-y) arguments, and returns the file descriptor (a number) that represents the opened file. It does not return a file object; the returned value will not have read() or write() methods.
"""
import re
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
# pip3 install pdfminer3k
from io import StringIO
from io import open
#pdf文件名
pdfFilename="avelumab.pdf"
#文件名前缀
frontName="usan/2016/"
#商标文件名
trademark_filename="trademarks.txt"
#赞助商文件名
sponsor_filename="sponsor.txt"
#读取PDF数据
def readPDF(pdfFile):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdfFile)
device.close()
content = retstr.getvalue()
retstr.close()
return content
#规范PDF数据
def Format(str1):
list2=[]
#分割成列表
list1=str1.split("\n")
for i in list1:
#if i=="/n":
if i=='' or i==' 'or i==' ':
continue
list2.append(i)
return list2
#提取me_usan,药品名
def Get_me_usan(the_list_data):
return the_list_data[0]
#提取me_therapeutic
def Get_me_therapeutic(the_list_data):
for i in the_list_data:
if "Treatment of" in i:
return i
#提取me_chemical1 分子式1
def Get_me_chemical1(the_list_data):
for i in the_list_data:
if "1. " in i:
return i
return ""
#提取me_chemical2 分子式2
def Get_me_chemical2(the_list_data):
for i in the_list_data:
if "2. " in i:
return i
return ""
#匹配分子式
def Re_formula(str1):
#匹配正在表达式
re_formula=re.compile(r'C(\d)+H(\d)+')
mo1=re_formula.search(str1)
if mo1!=None:
return True
return False
#提取me_mo_formula,特征包含碳氢CH元素
def Get_me_mo_formula(the_list_data):
for i in the_list_data:
#转换为大写
i=i.upper()
value=Re_formula(i)
if value==True:
return i
return ""
#提取分子质量me_mo_weight,如果出现MOLECULAR WEIGHT,且下一个值是数字或浮点数,就提取下一个值
def Get_me_mo_weight(the_list_data):
for count in range(len(the_list_data)):
#如果出现MOLECULAR WEIGHT,则提取下一个值
if 'MOLECULAR WEIGHT' in the_list_data[count]:
value=the_list_data[count+1]
if type(eval(value)) == int or type(eval(value)) == float:
return value
return ""
#从trademarks.txt搜索数据
def Get_txt_contents(filename):
file=open(filename)
content=file.readlines()
content1=[i.replace("\n","") for i in content]
return content1
#提取me_trademark,从trademarks.txt搜索数据
def Get_me_trademark(the_list_data):
for i in the_list_data:
i=i.strip(" ")
for k in list_trademarks:
if k in i:
return i
return ""
#提取me_sponsor,从sponsor.txt搜索数据
def Get_me_sponsor(the_list_data):
for i in the_list_data:
i=i.strip(" ")
for k in list_sponsors:
if k in i:
return i
return ""
#匹配CAS正则表达式
def Re_CAS(str1):
re_CAS=re.compile(r'(\d)+-(\d)+-(\d)+')
mo1=re_CAS.search(str1)
if mo1!=None:
return True
return False
#提取CAS
def Get_CAS(the_list_data):
for i in the_list_data:
value=Re_CAS(i)
if value==True:
return i
return ""
#匹配WHO正则表达式
def Re_WHO(str1):
re_WHO=re.compile(r'(\d)+')
mo1=re_WHO.search(str1)
if mo1!=None:
return True
return False
#提取WHO
def Get_WHO(the_list_data):
for count in range(len(the_list_data)):
#如果出现MOLECULAR WEIGHT,则提取下一个值
try:
if 'WHO NUMBER' in the_list_data[count]:
value=the_list_data[count+1]
if type(eval(value)) == int:
return value
except:
return ""
return ""
#匹配UNII正则表达式
def Re_UNII(str1):
#{10}表示出现10次
re_UNII=re.compile(r'[A-Za-z0-9]{10}')
mo1=re_UNII.search(str1)
if mo1!=None:
return True
return False
#提取UNII
def Get_UNII(the_list_data):
for count in range(len(the_list_data)):
#如果出现MOLECULAR WEIGHT,则提取下一个值
if 'UNII' in the_list_data[count]:
value=the_list_data[count+1]
if Re_UNII(value)==True:
return value
return ""
#获取me_down数据
def Get_me_down(the_list_data):
name=frontName+pdfFilename
return name
pdfFile = open(pdfFilename, 'rb')
outputString = readPDF(pdfFile)
list_data=Format(outputString)
me_source=2016
#提取me_usan,药品名
me_usan=Get_me_usan(list_data)
#提取me_therapeutic 治疗疾病
me_therapeutic=Get_me_therapeutic(list_data)
#提取me_therapeutic
me_chemical1=Get_me_chemical1(list_data)
#提取me_chemical2 分子式2
me_chemical2=Get_me_chemical2(list_data)
#提取me_mo_formula,特征包含碳氢CH元素
me_mo_formula=Get_me_mo_formula(list_data)
#提取分子质量me_mo_weight
#me_mo_weight=Get_me_mo_weight(list_data)
#商标名数据库
list_trademarks=Get_txt_contents(trademark_filename)
#提取商标名
me_trademark=Get_me_trademark(list_data)
#赞助商数据库
list_sponsors=Get_txt_contents(sponsor_filename)
#提取赞助商,新公司则找不到
me_sponsor=Get_me_sponsor(list_data)
#提取CAS
me_CAS=Get_CAS(list_data)
#提取WHO
me_WHO=Get_WHO(list_data)
#提取UNII
me_UNII=Get_UNII(list_data)
#获取me_down
me_down=Get_me_down(list_data)
#me_bianma数据默认为空
me_bianma=""
#me_ylbm数据默认为空
me_ylbm=""
me_mo_weight=""
多个PDF内容提取
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 27 11:37:54 2016
批量提取PDF数据到excel内
"""
import re
import os
import pandas,csv
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
# pip3 install pdfminer3k
from io import StringIO
from io import open
#获取目录内文件名
list_filenames=os.listdir()
#获取所有PDF文件名
list_pdfFilename=[i for i in list_filenames if ".pdf" in i]
#pdf文件名,测试用
#pdfFilename="cenobamate.pdf"
#参数设置
#文件名前缀
frontName="usan/2016/"
#me_sorce字段
me_source=2016
#me_bianma数据默认为空
me_bianma=""
#me_ylbm数据默认为空
me_ylbm=""
me_code=""
me_en=""
#me_mo_weight=""
#疾病诊断文件名
therapeutic_filename="therapeutic.txt"
#商标文件名
trademark_filename="trademarks.txt"
#赞助商文件名
sponsor_filename="sponsor.txt"
#读取PDF数据
def readPDF(pdfFile):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdfFile)
device.close()
content = retstr.getvalue()
retstr.close()
return content
#规范PDF数据
def Format(str1):
list2=[]
re_blank=re.compile(r'\s')
#分割成列表
list1=str1.split("\n")
for i in list1:
m=re_blank.search(i)
#遇到空格
if m==None:
continue
list2.append(i)
return list2
#提取me_usan,药品名,并非百分百准确
def Get_me_usan(pdfFilename):
me_usan=pdfFilename.replace(".pdf","")
return me_usan
#提取me_therapeutic
def Get_me_therapeutic(the_list_data):
for i in the_list_data:
#小写
i=i.lower()
for k in list_therapeutic:
if k in i:
return i
return ""
#提取me_chemical1 分子式1
def Get_me_chemical1(the_list_data):
for i in the_list_data:
if "1. " in i:
return i
return ""
#提取me_chemical2 分子式2
def Get_me_chemical2(the_list_data):
for i in the_list_data:
if "2. " in i:
return i
return ""
#匹配分子式
def Re_formula(str1):
#匹配正在表达式
re_formula=re.compile(r'C(\d)+H(\d)+')
mo1=re_formula.search(str1)
if mo1!=None:
return True
return False
#提取me_mo_formula,特征包含碳氢CH元素
def Get_me_mo_formula(the_list_data):
for i in the_list_data:
#转换为大写
i=i.upper()
value=Re_formula(i)
if value==True:
return i
return ""
#提取分子质量me_mo_weight,如果出现MOLECULAR WEIGHT,且下一个值是数字或浮点数,就提取下一个值
def Get_me_mo_weight(the_list_data):
for count in range(len(the_list_data)):
#如果出现MOLECULAR WEIGHT,则提取下一个值
if 'MOLECULAR WEIGHT' in the_list_data[count]:
value=the_list_data[count+1]
if "kDa" in value:
return value
try:
if type(eval(value)) == int or type(eval(value)) == float:
return value
except:
return ""
return ""
#从trademarks.txt搜索数据
def Get_txt_contents(filename):
file=open(filename)
content=file.readlines()
content1=[i.replace("\n","") for i in content]
#转换为小写
content2=[i.lower() for i in content1]
return content2
#提取me_trademark,从trademarks.txt搜索数据
def Get_me_trademark(the_list_data):
for i in the_list_data:
i=i.strip(" ")
for k in list_trademarks:
if k in i:
return i
return ""
#提取me_sponsor,从sponsor.txt搜索数据
def Get_me_sponsor(the_list_data):
for i in the_list_data:
i=i.strip(" ")
for k in list_sponsors:
if k in i:
return i
return ""
#匹配CAS正则表达式
def Re_CAS(str1):
re_CAS=re.compile(r'(\d)+-(\d)+-(\d)+')
mo1=re_CAS.search(str1)
if mo1!=None:
return True
return False
#提取CAS
def Get_CAS(the_list_data):
for i in the_list_data:
value=Re_CAS(i)
if value==True:
return i
return ""
#匹配WHO正则表达式
def Re_WHO(str1):
re_WHO=re.compile(r'(\d)+')
mo1=re_WHO.search(str1)
if mo1!=None:
return True
return False
#提取WHO
#提取WHO
def Get_WHO(the_list_data):
for count in range(len(the_list_data)):
#如果出现MOLECULAR WEIGHT,则提取下一个值
try:
if 'WHO NUMBER' in the_list_data[count]:
value=the_list_data[count+1]
if type(eval(value)) == int:
return value
except:
return ""
return ""
#匹配UNII正则表达式
def Re_UNII(str1):
#{10}表示出现10次
re_UNII=re.compile(r'[A-Za-z0-9]{10}')
mo1=re_UNII.search(str1)
if mo1!=None:
return True
return False
#提取UNII
def Get_UNII(the_list_data):
for count in range(len(the_list_data)):
#如果出现MOLECULAR WEIGHT,则提取下一个值
if 'UNII' in the_list_data[count]:
value=the_list_data[count+1]
if Re_UNII(value)==True:
return value
return ""
#获取me_down数据
def Get_me_down(pdfFilename):
name=frontName+pdfFilename
return name
#获取单个PDF的药品名称,编码,who,unii,分子式等内容
def Get_one_pdf_content(pdfFilename,count):
list_one_pdf_content=[]
pdfFile = open(pdfFilename, 'rb')
outputString = readPDF(pdfFile)
list_data=Format(outputString)
#me_uid
me_uid=count
#提取me_usan,药品名
me_usan=Get_me_usan(pdfFilename)
#提取me_therapeutic 治疗疾病,用字典方法改写
me_therapeutic=Get_me_therapeutic(list_data)
#提取me_therapeutic
me_chemical1=Get_me_chemical1(list_data)
#提取me_chemical2 分子式2
me_chemical2=Get_me_chemical2(list_data)
#提取me_mo_formula,特征包含碳氢CH元素
me_mo_formula=Get_me_mo_formula(list_data)
#提取分子质量me_mo_weight,有问题需要改进
me_mo_weight=Get_me_mo_weight(list_data)
#提取商标名
me_trademark=Get_me_trademark(list_data)
#提取赞助商,新公司则找不到
me_sponsor=Get_me_sponsor(list_data)
#提取CAS
me_CAS=Get_CAS(list_data)
#提取WHO
me_WHO=Get_WHO(list_data)
#提取UNII
me_UNII=Get_UNII(list_data)
#获取me_down
me_down=Get_me_down(pdfFilename)
#把所有内容添加进去
list_one_pdf_content.append(me_uid)
list_one_pdf_content.append(me_source)
list_one_pdf_content.append(me_usan)
list_one_pdf_content.append(me_therapeutic)
list_one_pdf_content.append(me_chemical1)
list_one_pdf_content.append(me_chemical2)
list_one_pdf_content.append(me_mo_formula)
list_one_pdf_content.append(me_mo_weight)
list_one_pdf_content.append(me_trademark)
list_one_pdf_content.append(me_sponsor)
list_one_pdf_content.append(me_code)
list_one_pdf_content.append(me_CAS)
list_one_pdf_content.append(me_WHO)
list_one_pdf_content.append(me_UNII)
list_one_pdf_content.append(me_en)
list_one_pdf_content.append(me_down)
list_one_pdf_content.append(me_bianma)
list_one_pdf_content.append(me_ylbm)
return list_one_pdf_content
#获取所有PDF的药品名称,编码,who,unii,分子式等内容
def Get_all_pdf_content(list_pdfFilename):
#添加首行
list_all_pdfContent.append(list_firstRow)
for count in range(len(list_pdfFilename)):
filename=list_pdfFilename[count]
try:
list_one_pdf_content=Get_one_pdf_content(filename,count)
except:
list_one_pdf_content=""
list_all_pdfContent.append(list_one_pdf_content)
return list_all_pdfContent
#首行信息
list_firstRow=["me_uid","me_source","me_usan","me_therapeutic","me_chemical1","me_chemical2","me_mo_formula","me_mo_weight","me_trademark","me_sponsor",
"me_codename","me_cas","me_who","me_unii","me_en","me_down","me_bianma","me_ylbm"]
#治疗疾病数据库
list_therapeutic=Get_txt_contents(therapeutic_filename)
#商标名数据库
list_trademarks=Get_txt_contents(trademark_filename)
#赞助商数据库
list_sponsors=Get_txt_contents(sponsor_filename)
#获取所有PDF的药品名称,编码,who,unii,分子式等内容
list_all_pdfContent=[]
list_all_pdfContent=Get_all_pdf_content(list_pdfFilename)
csvObj=open("output.csv",'w',newline='')
csvWriter=csv.writer(csvObj)
for rowData in list_all_pdfContent:
csvWriter.writerow(rowData)
csvObj.close()
需要数据库

自动输出结果

美国usan数据库——PDF提取的更多相关文章
- 单个pdf提取测试
# -*- coding: utf-8 -*- """ Created on Wed Feb 3 09:32:22 2016 pdf单个文件提取测试 @author: A ...
- 转载-SQL中的where条件,在数据库中提取与应用浅析
1 问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语 ...
- python操作MONGODB数据库,提取部分数据再存储
目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数. ...
- SQL中的where条件,在数据库中提取与应用浅析
1. 问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限 ...
- django之创建第8-3个项目-数据库数据提取之高级操作
1.配置test2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 转: SQL中的where条件,在数据库中提取与应用浅析
SQL中的where条件,在数据库中提取与应用浅析 http://hedengcheng.com/?p=577 1问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当 ...
- 0320SQL中的where条件,在数据库中提取与应用浅析
转自 何登成的技术博客 追求技术的道路上,10年如一日 首页 关于我 RSS 订阅 © 2012-2017 何登成的技术博客 SQL中的where条件,在数据库中提取与应用浅析 3月 3r ...
- Kettle实现从数据库中提取数据到Excel
因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ ...
- 二十五、sql中where条件在数据库中提取与应用浅析
问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检查. ...
随机推荐
- 关于bundle install 的一点补充
在第一次运行bundle install之后,生成了Gemfile.lock文件,里面记录gem的具体版本号,按照官方文档说明,以后运行bundle install就不会再依据Gemfile,而是根据 ...
- ERROR 2003 (HY000): Can't connect to MySQL server on 'ip address' (111)的处理办法
远程连接mysql数据库时可以使用以下指令 mysql -h 192.168.1.104 -u root -p 如果是初次安装mysql,需要将所有/etc/mysql/内的所有配置文件的bind-a ...
- x86开启 HUGEPAGES
HugePage,就是指的大页内存管理方式,在操作系统Linux环境中,内存是以页Page的方式进行分配,默认大小为4K,HugePage是传统4K Page的替代方案.顾名思义,是用HugePage ...
- Ubuntu管理开机启动服务项 -- 图形界面的Boot-up Manager
有时学习时安装的服务太多,比如mysql.mongodb.redis.apache.nginx等等,它们都是默认开机启动的,如果不想让它们开机启动,用到时再自己手工启动怎么办呢? 使用sysv-rc- ...
- 方法传参(JAVA与C的比较)
java代码:public class Test{ static int e; // 默认是0 static String f; //默认是null public static void main(S ...
- 编程语言吉祥物之Duke
在看到这个可爱的小家伙前,我一直以为那个咖啡杯子是Java的吉祥物.直到拿到<Java性能优化权威指南>这本书,才知道有这个小东西Duke.这位可爱的Duke是由Joe Palrang在1 ...
- LA 3231 - Fair Share
You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...
- [LeetCode] Odd Even Linked List 奇偶链表
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...
- 关于AngularJS(1)
在讲正题之前,先说一下有关angular简介方面的信息: 1. angularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经 ...