QQ:231469242 原创

单个PDF内容提取

  1. # -*- coding: utf-8 -*-
  2. """
  3.  
  4. 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.
  5.  
  6. 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.
  7. """
  8. import re
  9. from pdfminer.pdfinterp import PDFResourceManager, process_pdf
  10. from pdfminer.converter import TextConverter
  11. from pdfminer.layout import LAParams
  12.  
  13. # pip3 install pdfminer3k
  14.  
  15. from io import StringIO
  16. from io import open
  17.  
  18. #pdf文件名
  19. pdfFilename="avelumab.pdf"
  20. #文件名前缀
  21. frontName="usan/2016/"
  22. #商标文件名
  23. trademark_filename="trademarks.txt"
  24. #赞助商文件名
  25. sponsor_filename="sponsor.txt"
  26.  
  27. #读取PDF数据
  28. def readPDF(pdfFile):
  29. rsrcmgr = PDFResourceManager()
  30. retstr = StringIO()
  31. laparams = LAParams()
  32. device = TextConverter(rsrcmgr, retstr, laparams=laparams)
  33. process_pdf(rsrcmgr, device, pdfFile)
  34. device.close()
  35. content = retstr.getvalue()
  36. retstr.close()
  37. return content
  38.  
  39. #规范PDF数据
  40. def Format(str1):
  41. list2=[]
  42. #分割成列表
  43. list1=str1.split("\n")
  44. for i in list1:
  45. #if i=="/n":
  46. if i=='' or i==' 'or i==' ':
  47. continue
  48. list2.append(i)
  49.  
  50. return list2
  51.  
  52. #提取me_usan,药品名
  53. def Get_me_usan(the_list_data):
  54. return the_list_data[0]
  55.  
  56. #提取me_therapeutic
  57. def Get_me_therapeutic(the_list_data):
  58. for i in the_list_data:
  59. if "Treatment of" in i:
  60. return i
  61.  
  62. #提取me_chemical1 分子式1
  63. def Get_me_chemical1(the_list_data):
  64. for i in the_list_data:
  65. if "1. " in i:
  66. return i
  67. return ""
  68.  
  69. #提取me_chemical2 分子式2
  70. def Get_me_chemical2(the_list_data):
  71. for i in the_list_data:
  72. if "2. " in i:
  73. return i
  74. return ""
  75.  
  76. #匹配分子式
  77. def Re_formula(str1):
  78. #匹配正在表达式
  79. re_formula=re.compile(r'C(\d)+H(\d)+')
  80. mo1=re_formula.search(str1)
  81. if mo1!=None:
  82. return True
  83. return False
  84.  
  85. #提取me_mo_formula,特征包含碳氢CH元素
  86. def Get_me_mo_formula(the_list_data):
  87. for i in the_list_data:
  88. #转换为大写
  89. i=i.upper()
  90. value=Re_formula(i)
  91. if value==True:
  92. return i
  93.  
  94. return ""
  95.  
  96. #提取分子质量me_mo_weight,如果出现MOLECULAR WEIGHT,且下一个值是数字或浮点数,就提取下一个值
  97. def Get_me_mo_weight(the_list_data):
  98. for count in range(len(the_list_data)):
  99. #如果出现MOLECULAR WEIGHT,则提取下一个值
  100. if 'MOLECULAR WEIGHT' in the_list_data[count]:
  101. value=the_list_data[count+1]
  102. if type(eval(value)) == int or type(eval(value)) == float:
  103. return value
  104. return ""
  105.  
  106. #从trademarks.txt搜索数据
  107. def Get_txt_contents(filename):
  108. file=open(filename)
  109. content=file.readlines()
  110. content1=[i.replace("\n","") for i in content]
  111. return content1
  112.  
  113. #提取me_trademark,从trademarks.txt搜索数据
  114. def Get_me_trademark(the_list_data):
  115. for i in the_list_data:
  116. i=i.strip(" ")
  117. for k in list_trademarks:
  118. if k in i:
  119. return i
  120. return ""
  121.  
  122. #提取me_sponsor,从sponsor.txt搜索数据
  123. def Get_me_sponsor(the_list_data):
  124. for i in the_list_data:
  125. i=i.strip(" ")
  126. for k in list_sponsors:
  127. if k in i:
  128. return i
  129. return ""
  130.  
  131. #匹配CAS正则表达式
  132. def Re_CAS(str1):
  133. re_CAS=re.compile(r'(\d)+-(\d)+-(\d)+')
  134. mo1=re_CAS.search(str1)
  135. if mo1!=None:
  136. return True
  137. return False
  138.  
  139. #提取CAS
  140. def Get_CAS(the_list_data):
  141. for i in the_list_data:
  142. value=Re_CAS(i)
  143. if value==True:
  144. return i
  145.  
  146. return ""
  147.  
  148. #匹配WHO正则表达式
  149. def Re_WHO(str1):
  150. re_WHO=re.compile(r'(\d)+')
  151. mo1=re_WHO.search(str1)
  152. if mo1!=None:
  153. return True
  154. return False
  155.  
  156. #提取WHO
  157. def Get_WHO(the_list_data):
  158. for count in range(len(the_list_data)):
  159. #如果出现MOLECULAR WEIGHT,则提取下一个值
  160. try:
  161. if 'WHO NUMBER' in the_list_data[count]:
  162. value=the_list_data[count+1]
  163. if type(eval(value)) == int:
  164. return value
  165. except:
  166. return ""
  167. return ""
  168.  
  169. #匹配UNII正则表达式
  170. def Re_UNII(str1):
  171. #{10}表示出现10次
  172. re_UNII=re.compile(r'[A-Za-z0-9]{10}')
  173. mo1=re_UNII.search(str1)
  174. if mo1!=None:
  175. return True
  176. return False
  177.  
  178. #提取UNII
  179. def Get_UNII(the_list_data):
  180. for count in range(len(the_list_data)):
  181. #如果出现MOLECULAR WEIGHT,则提取下一个值
  182. if 'UNII' in the_list_data[count]:
  183. value=the_list_data[count+1]
  184. if Re_UNII(value)==True:
  185. return value
  186. return ""
  187.  
  188. #获取me_down数据
  189. def Get_me_down(the_list_data):
  190. name=frontName+pdfFilename
  191. return name
  192.  
  193. pdfFile = open(pdfFilename, 'rb')
  194. outputString = readPDF(pdfFile)
  195.  
  196. list_data=Format(outputString)
  197.  
  198. me_source=2016
  199.  
  200. #提取me_usan,药品名
  201. me_usan=Get_me_usan(list_data)
  202. #提取me_therapeutic 治疗疾病
  203. me_therapeutic=Get_me_therapeutic(list_data)
  204. #提取me_therapeutic
  205. me_chemical1=Get_me_chemical1(list_data)
  206.  
  207. #提取me_chemical2 分子式2
  208. me_chemical2=Get_me_chemical2(list_data)
  209.  
  210. #提取me_mo_formula,特征包含碳氢CH元素
  211. me_mo_formula=Get_me_mo_formula(list_data)
  212.  
  213. #提取分子质量me_mo_weight
  214. #me_mo_weight=Get_me_mo_weight(list_data)
  215.  
  216. #商标名数据库
  217. list_trademarks=Get_txt_contents(trademark_filename)
  218. #提取商标名
  219. me_trademark=Get_me_trademark(list_data)
  220. #赞助商数据库
  221. list_sponsors=Get_txt_contents(sponsor_filename)
  222. #提取赞助商,新公司则找不到
  223. me_sponsor=Get_me_sponsor(list_data)
  224. #提取CAS
  225. me_CAS=Get_CAS(list_data)
  226. #提取WHO
  227. me_WHO=Get_WHO(list_data)
  228. #提取UNII
  229. me_UNII=Get_UNII(list_data)
  230. #获取me_down
  231. me_down=Get_me_down(list_data)
  232. #me_bianma数据默认为空
  233. me_bianma=""
  234. #me_ylbm数据默认为空
  235. me_ylbm=""
  236.  
  237. me_mo_weight=""

多个PDF内容提取

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Dec 27 11:37:54 2016
  4.  
  5. 批量提取PDF数据到excel内
  6.  
  7. """
  8.  
  9. import re
  10. import os
  11. import pandas,csv
  12. from pdfminer.pdfinterp import PDFResourceManager, process_pdf
  13. from pdfminer.converter import TextConverter
  14. from pdfminer.layout import LAParams
  15.  
  16. # pip3 install pdfminer3k
  17.  
  18. from io import StringIO
  19. from io import open
  20.  
  21. #获取目录内文件名
  22. list_filenames=os.listdir()
  23. #获取所有PDF文件名
  24. list_pdfFilename=[i for i in list_filenames if ".pdf" in i]
  25.  
  26. #pdf文件名,测试用
  27. #pdfFilename="cenobamate.pdf"
  28.  
  29. #参数设置
  30. #文件名前缀
  31. frontName="usan/2016/"
  32. #me_sorce字段
  33. me_source=2016
  34. #me_bianma数据默认为空
  35. me_bianma=""
  36. #me_ylbm数据默认为空
  37. me_ylbm=""
  38. me_code=""
  39. me_en=""
  40. #me_mo_weight=""
  41. #疾病诊断文件名
  42. therapeutic_filename="therapeutic.txt"
  43. #商标文件名
  44. trademark_filename="trademarks.txt"
  45. #赞助商文件名
  46. sponsor_filename="sponsor.txt"
  47. #读取PDF数据
  48. def readPDF(pdfFile):
  49. rsrcmgr = PDFResourceManager()
  50. retstr = StringIO()
  51. laparams = LAParams()
  52. device = TextConverter(rsrcmgr, retstr, laparams=laparams)
  53. process_pdf(rsrcmgr, device, pdfFile)
  54. device.close()
  55. content = retstr.getvalue()
  56. retstr.close()
  57. return content
  58.  
  59. #规范PDF数据
  60. def Format(str1):
  61. list2=[]
  62. re_blank=re.compile(r'\s')
  63. #分割成列表
  64. list1=str1.split("\n")
  65. for i in list1:
  66. m=re_blank.search(i)
  67. #遇到空格
  68. if m==None:
  69. continue
  70. list2.append(i)
  71.  
  72. return list2
  73.  
  74. #提取me_usan,药品名,并非百分百准确
  75. def Get_me_usan(pdfFilename):
  76. me_usan=pdfFilename.replace(".pdf","")
  77. return me_usan
  78.  
  79. #提取me_therapeutic
  80. def Get_me_therapeutic(the_list_data):
  81. for i in the_list_data:
  82. #小写
  83. i=i.lower()
  84. for k in list_therapeutic:
  85. if k in i:
  86. return i
  87. return ""
  88.  
  89. #提取me_chemical1 分子式1
  90. def Get_me_chemical1(the_list_data):
  91. for i in the_list_data:
  92. if "1. " in i:
  93. return i
  94. return ""
  95.  
  96. #提取me_chemical2 分子式2
  97. def Get_me_chemical2(the_list_data):
  98. for i in the_list_data:
  99. if "2. " in i:
  100. return i
  101. return ""
  102.  
  103. #匹配分子式
  104. def Re_formula(str1):
  105. #匹配正在表达式
  106. re_formula=re.compile(r'C(\d)+H(\d)+')
  107. mo1=re_formula.search(str1)
  108. if mo1!=None:
  109. return True
  110. return False
  111.  
  112. #提取me_mo_formula,特征包含碳氢CH元素
  113. def Get_me_mo_formula(the_list_data):
  114. for i in the_list_data:
  115. #转换为大写
  116. i=i.upper()
  117. value=Re_formula(i)
  118. if value==True:
  119. return i
  120.  
  121. return ""
  122.  
  123. #提取分子质量me_mo_weight,如果出现MOLECULAR WEIGHT,且下一个值是数字或浮点数,就提取下一个值
  124. def Get_me_mo_weight(the_list_data):
  125. for count in range(len(the_list_data)):
  126. #如果出现MOLECULAR WEIGHT,则提取下一个值
  127. if 'MOLECULAR WEIGHT' in the_list_data[count]:
  128. value=the_list_data[count+1]
  129. if "kDa" in value:
  130. return value
  131. try:
  132. if type(eval(value)) == int or type(eval(value)) == float:
  133. return value
  134. except:
  135. return ""
  136. return ""
  137.  
  138. #从trademarks.txt搜索数据
  139. def Get_txt_contents(filename):
  140. file=open(filename)
  141. content=file.readlines()
  142. content1=[i.replace("\n","") for i in content]
  143. #转换为小写
  144. content2=[i.lower() for i in content1]
  145. return content2
  146.  
  147. #提取me_trademark,从trademarks.txt搜索数据
  148. def Get_me_trademark(the_list_data):
  149. for i in the_list_data:
  150. i=i.strip(" ")
  151. for k in list_trademarks:
  152. if k in i:
  153. return i
  154. return ""
  155.  
  156. #提取me_sponsor,从sponsor.txt搜索数据
  157. def Get_me_sponsor(the_list_data):
  158. for i in the_list_data:
  159. i=i.strip(" ")
  160. for k in list_sponsors:
  161. if k in i:
  162. return i
  163. return ""
  164.  
  165. #匹配CAS正则表达式
  166. def Re_CAS(str1):
  167. re_CAS=re.compile(r'(\d)+-(\d)+-(\d)+')
  168. mo1=re_CAS.search(str1)
  169. if mo1!=None:
  170. return True
  171. return False
  172.  
  173. #提取CAS
  174. def Get_CAS(the_list_data):
  175. for i in the_list_data:
  176. value=Re_CAS(i)
  177. if value==True:
  178. return i
  179.  
  180. return ""
  181.  
  182. #匹配WHO正则表达式
  183. def Re_WHO(str1):
  184. re_WHO=re.compile(r'(\d)+')
  185. mo1=re_WHO.search(str1)
  186. if mo1!=None:
  187. return True
  188. return False
  189.  
  190. #提取WHO
  191. #提取WHO
  192. def Get_WHO(the_list_data):
  193. for count in range(len(the_list_data)):
  194. #如果出现MOLECULAR WEIGHT,则提取下一个值
  195. try:
  196. if 'WHO NUMBER' in the_list_data[count]:
  197. value=the_list_data[count+1]
  198. if type(eval(value)) == int:
  199. return value
  200. except:
  201. return ""
  202. return ""
  203.  
  204. #匹配UNII正则表达式
  205. def Re_UNII(str1):
  206. #{10}表示出现10次
  207. re_UNII=re.compile(r'[A-Za-z0-9]{10}')
  208. mo1=re_UNII.search(str1)
  209. if mo1!=None:
  210. return True
  211. return False
  212.  
  213. #提取UNII
  214. def Get_UNII(the_list_data):
  215. for count in range(len(the_list_data)):
  216. #如果出现MOLECULAR WEIGHT,则提取下一个值
  217. if 'UNII' in the_list_data[count]:
  218. value=the_list_data[count+1]
  219. if Re_UNII(value)==True:
  220. return value
  221. return ""
  222.  
  223. #获取me_down数据
  224. def Get_me_down(pdfFilename):
  225. name=frontName+pdfFilename
  226. return name
  227.  
  228. #获取单个PDF的药品名称,编码,who,unii,分子式等内容
  229. def Get_one_pdf_content(pdfFilename,count):
  230. list_one_pdf_content=[]
  231. pdfFile = open(pdfFilename, 'rb')
  232. outputString = readPDF(pdfFile)
  233. list_data=Format(outputString)
  234.  
  235. #me_uid
  236. me_uid=count
  237. #提取me_usan,药品名
  238. me_usan=Get_me_usan(pdfFilename)
  239. #提取me_therapeutic 治疗疾病,用字典方法改写
  240. me_therapeutic=Get_me_therapeutic(list_data)
  241. #提取me_therapeutic
  242. me_chemical1=Get_me_chemical1(list_data)
  243. #提取me_chemical2 分子式2
  244. me_chemical2=Get_me_chemical2(list_data)
  245. #提取me_mo_formula,特征包含碳氢CH元素
  246. me_mo_formula=Get_me_mo_formula(list_data)
  247. #提取分子质量me_mo_weight,有问题需要改进
  248. me_mo_weight=Get_me_mo_weight(list_data)
  249. #提取商标名
  250. me_trademark=Get_me_trademark(list_data)
  251. #提取赞助商,新公司则找不到
  252. me_sponsor=Get_me_sponsor(list_data)
  253. #提取CAS
  254. me_CAS=Get_CAS(list_data)
  255. #提取WHO
  256. me_WHO=Get_WHO(list_data)
  257. #提取UNII
  258. me_UNII=Get_UNII(list_data)
  259. #获取me_down
  260. me_down=Get_me_down(pdfFilename)
  261.  
  262. #把所有内容添加进去
  263. list_one_pdf_content.append(me_uid)
  264. list_one_pdf_content.append(me_source)
  265. list_one_pdf_content.append(me_usan)
  266. list_one_pdf_content.append(me_therapeutic)
  267. list_one_pdf_content.append(me_chemical1)
  268. list_one_pdf_content.append(me_chemical2)
  269. list_one_pdf_content.append(me_mo_formula)
  270. list_one_pdf_content.append(me_mo_weight)
  271. list_one_pdf_content.append(me_trademark)
  272. list_one_pdf_content.append(me_sponsor)
  273. list_one_pdf_content.append(me_code)
  274. list_one_pdf_content.append(me_CAS)
  275. list_one_pdf_content.append(me_WHO)
  276. list_one_pdf_content.append(me_UNII)
  277. list_one_pdf_content.append(me_en)
  278. list_one_pdf_content.append(me_down)
  279. list_one_pdf_content.append(me_bianma)
  280. list_one_pdf_content.append(me_ylbm)
  281. return list_one_pdf_content
  282.  
  283. #获取所有PDF的药品名称,编码,who,unii,分子式等内容
  284. def Get_all_pdf_content(list_pdfFilename):
  285. #添加首行
  286. list_all_pdfContent.append(list_firstRow)
  287. for count in range(len(list_pdfFilename)):
  288. filename=list_pdfFilename[count]
  289. try:
  290. list_one_pdf_content=Get_one_pdf_content(filename,count)
  291. except:
  292. list_one_pdf_content=""
  293.  
  294. list_all_pdfContent.append(list_one_pdf_content)
  295.  
  296. return list_all_pdfContent
  297.  
  298. #首行信息
  299. list_firstRow=["me_uid","me_source","me_usan","me_therapeutic","me_chemical1","me_chemical2","me_mo_formula","me_mo_weight","me_trademark","me_sponsor",
  300. "me_codename","me_cas","me_who","me_unii","me_en","me_down","me_bianma","me_ylbm"]
  301.  
  302. #治疗疾病数据库
  303. list_therapeutic=Get_txt_contents(therapeutic_filename)
  304. #商标名数据库
  305. list_trademarks=Get_txt_contents(trademark_filename)
  306. #赞助商数据库
  307. list_sponsors=Get_txt_contents(sponsor_filename)
  308. #获取所有PDF的药品名称,编码,who,unii,分子式等内容
  309. list_all_pdfContent=[]
  310. list_all_pdfContent=Get_all_pdf_content(list_pdfFilename)
  311.  
  312. csvObj=open("output.csv",'w',newline='')
  313. csvWriter=csv.writer(csvObj)
  314. for rowData in list_all_pdfContent:
  315. csvWriter.writerow(rowData)
  316. csvObj.close()

需要数据库

自动输出结果

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

  1. 单个pdf提取测试

    # -*- coding: utf-8 -*- """ Created on Wed Feb 3 09:32:22 2016 pdf单个文件提取测试 @author: A ...

  2. 转载-SQL中的where条件,在数据库中提取与应用浅析

    1        问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语 ...

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

    目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数. ...

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

    1. 问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限 ...

  5. django之创建第8-3个项目-数据库数据提取之高级操作

    1.配置test2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

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

    SQL中的where条件,在数据库中提取与应用浅析 http://hedengcheng.com/?p=577 1问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当 ...

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

    转自 何登成的技术博客 追求技术的道路上,10年如一日     首页 关于我 RSS 订阅 © 2012-2017 何登成的技术博客   SQL中的where条件,在数据库中提取与应用浅析 3月 3r ...

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

    因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ ...

  9. 二十五、sql中where条件在数据库中提取与应用浅析

    问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检查. ...

随机推荐

  1. javascript继承笔记

    //原型(prototype):原型是一个对象,其他对象可以通过它实现属性继承 /*笔记: * 1.类式继承:通过原型链继承的方式 * 2.原型式继承:对类式继承的封装 * 3.寄生式继承:对原型继承 ...

  2. vs2013给项目统一配置boost库

    1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...

  3. 无法安装Windows Live“OnCatalogResult:0x80190194”错误的解决方法

    今天想安装一个博客客户端,结果安装一直报错"OnCatalogResult:0x80190194",百度查到了解决发放再此记录下来,以备后用. 到官网下载了一个在线安装程序,可是一 ...

  4. POJ 2255. Tree Recovery

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11939   Accepted: 7493 De ...

  5. PHP基础语法

             PHP:超级文本预处理器一,PHP的四对标记 <?php ?> <script language="php"> <script> ...

  6. Linux文本查看及处理.md

    cat cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 主要功能 一次显示整个文件:cat ...

  7. js中避免函数名和变量名跟别人冲突

    待补充 .... 参考链接: http://blog.csdn.net/formyqianduan/article/details/52118690

  8. [LeetCode] Can I Win 我能赢吗

    In the "100 game," two players take turns adding, to a running total, any integer from 1.. ...

  9. AppBox_v2.0完整版免费下载,暨AppBox_v3.0正式发布!

    文章更新: AppBox v6.0中实现子页面和父页面的复杂交互 AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox ...

  10. 使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题

    一.前言 最近一段时间,网站经常出现两个问题: 1.内存占用率一点点增高,直到将服务器内存占满. 2.访问某个页面时,页面响应过慢,CPU居高不下. 初步判断内存一点点增多可能是因为有未释放的资源一直 ...