美国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()

需要数据库

自动输出结果

时间: 2024-10-20 15:46:22

美国usan数据库——PDF提取的相关文章

SQL中的where条件,在数据库中提取与应用浅析

来源:深入MySQL内核 1        问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检查.查询优化.SQL执行等一系列的步骤,简短的篇幅是绝对无能为力的.因此,本文挑选了其中的部分内容,也是我一直都想写的一个内容,做重点介绍: 给定一条SQL,如何提取其中的where条件?where条件中的每个子条件,在SQL执行的过程中有分别起着什么样的作用

python操作MONGODB数据库,提取部分数据再存储

目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数.从每个集合中提取的数据存放到新的对应集合中,新集合名称为原先集合加"_col". 用到相关技术点: 操作MONGODB: 先通过IP和端口号连接到MONGODB所在的机器,得到一个MONGODB客户端对象,然后认证某个数据库的账号密码连接到该数据库,得到一个该数据库的对象.一个数据库下有很

Kettle实现从数据库中提取数据到Excel

因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ 首先我们需要新建 转换  转换: 可以将数据从数据库中提取到excel中  然后我们如果想要定时提取数据的话,可以新建 作业 作业: 可以定时执行转换任务,然后还可以将发送邮件耶~ (不过这个技能我还不是很熟悉,等我熟悉了再更新嘻嘻) 一 . 新建转换 1.点击 + 号 ,也就是新建 ,然后选择 转

从Zabbix数据库中提取内存采集的数据,做内存使用率计算

背景需求很简单,分析所有的设备的内存使用率,看那些设备的内存不够用是否需要加内存... 下面的脚本逻辑,就是通过提取zabbix数据库中的hostid,在提取itemid.. 然后通过item name过滤提取趋势数据,获取一天中最大的内存总数和最小可用内存 然后在计算在一天中最小内存可用率的设备, 下面的是通过free来计算的,当然也可以通过used来计算了... #!/usr/bin/ruby $KCODE = 'utf8' require 'mysql' db = Mysql.real_c

虚拟机都丢失了里面的数据库怎么提取出来呢

介绍多了服务器类的数据恢复案例,今天小编从虚拟机数据恢复角度为大家介绍一篇由于异常断电导致的虚拟机无法启动的数据恢复成功案例.其中不仅涉及虚拟机数据恢复,另外也涉及有服务器数据恢复.数据库修复等技术知识.客户的一台虚拟机由于服务器异常断电导致无法启动,客户虚拟机基于某知名品牌EVA8400服务器硬件,采用了ESXI5.5操作系统,虚拟机里的数据是数据库.客户虚拟机无法启动后进行了一次重启服务器操作,但是虚拟机依然无法启动,由于客户数据涉密,只好联系专业数据恢复操作.数据恢复工程师前往客户现场进行

轻松学SQL Server数据库pdf

下载地址:网盘下载 目录: 第1章 数据库与SQL Server 2008 11.1 数据库基础 21.1.1 数据库的概念 21.1.2 数据库模型 21.2 什么是关系型数据库 21.2.1 关系型数据库的概念 31.2.2 一些常用术语 41.2.3 数据库管理系统的功能 41.2.4 关系模型完整性规则 51.3 实体关系(E-R)模型 51.3.1 实体模型 61.3.2 关系模型 61.4 数据库设计的三大范式 71.5 SQL Server 2008的体系结构 91.6 SQL S

pdf提取文本转html笔记

曾经为了实现pdf的转化测试了太多的文件,导致现在我自己都有点晕了. 再者就是从cnki下载的pdf文件不知道为什么用pdf2htmlEX无法转化. xpdf xpdf的使用:参考链接 http://blog.csdn.net/jiang1984j/article/details/5757427 和 http://my.oschina.net/zbrxtpgyaps/blog/28171?fromerr=zd6Ms31I 我再使用的过程中将http://blog.csdn.net/jiang19

PDF文本内容批量提取到Excel

QQ:231469242,版权所有 作用:pdf内容批量提取到excel 各位亲朋好友,我才上班时候有个鼓噪乏味工作,就是把一个个PDF内容复制粘贴到Excel表格里面,方便以后数据库全文搜索. 举个例子,此Excel有两个字段 A列是pdf文件名 B列用于存放pdf提取的内容 当所有PDF内容复制到Excel后,数据库就可以实现全文搜索功能. 几十上百个PDF复制粘贴工作也许一天就搞定了,但成千上万个PDF,你是不是要抓狂?为此,我专门用Python开发了PDF批量提取机器人,名字叫pdf_d

PDFBox的使用——分页提取PDF文本

需求:用java分页提取PDF文本. PDFBox是一个很好的可以满足上述需求的开源工具. 1.PDF文档结构 要解析PDF文本,我们首先要了解PDF文件的结构. 关于PDF文档,最重要的几点: 一,PDF文档内容比较复杂,比如有纯文本(可以提取出其中的文字,可以用PDF软件中的“复制”功能).图片(无法使用PDF软件中的“复制”功能).表单.视频.音频等,总之形式比较复杂: 二,PDF文件采用二进制流与纯文字混合的编码模式,并且没有采用 Unicode 等标准字符编码方式,其字符编码采用 Ad