美国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的词法解析.语法解析.权限检查. ...
随机推荐
- javascript继承笔记
//原型(prototype):原型是一个对象,其他对象可以通过它实现属性继承 /*笔记: * 1.类式继承:通过原型链继承的方式 * 2.原型式继承:对类式继承的封装 * 3.寄生式继承:对原型继承 ...
- vs2013给项目统一配置boost库
1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...
- 无法安装Windows Live“OnCatalogResult:0x80190194”错误的解决方法
今天想安装一个博客客户端,结果安装一直报错"OnCatalogResult:0x80190194",百度查到了解决发放再此记录下来,以备后用. 到官网下载了一个在线安装程序,可是一 ...
- POJ 2255. Tree Recovery
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11939 Accepted: 7493 De ...
- PHP基础语法
PHP:超级文本预处理器一,PHP的四对标记 <?php ?> <script language="php"> <script> ...
- Linux文本查看及处理.md
cat cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 主要功能 一次显示整个文件:cat ...
- js中避免函数名和变量名跟别人冲突
待补充 .... 参考链接: http://blog.csdn.net/formyqianduan/article/details/52118690
- [LeetCode] Can I Win 我能赢吗
In the "100 game," two players take turns adding, to a running total, any integer from 1.. ...
- AppBox_v2.0完整版免费下载,暨AppBox_v3.0正式发布!
文章更新: AppBox v6.0中实现子页面和父页面的复杂交互 AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox ...
- 使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
一.前言 最近一段时间,网站经常出现两个问题: 1.内存占用率一点点增高,直到将服务器内存占满. 2.访问某个页面时,页面响应过慢,CPU居高不下. 初步判断内存一点点增多可能是因为有未释放的资源一直 ...