当前位置: 首页 > 科技观察

Python实现PD文本识别,提取写入CSV文件脚本分享

时间:2023-03-14 09:32:41 科技观察

1.前言2.需求描述3.开始动手做3.1安装相关第三方包3.2导入需要的第三方库3.3读取pdf文件,并识别内容3.4对识别出的数据进行处理,写入csv文件小结1.前言扫描件一直受到大众的青睐。任何纸质文件都可以扫描后存档,想用就用手机打开,省心省力。但是,扫描文件的优势也带来了它的劣势,因为它是用电子设备扫描的,所以出来的是图像。如果要对文档上的内容进行处理,直接操作是无法实现的。那么如果要引用它的内容怎么办呢?别着急,Python帮你解决问题。2.需求描述有一个pdf扫描件,我们要提取文本分三列写入一个csv文件。内容及效果如下:pdfexamplecsvexample3。开始手动动脑。扫描的pdf是将文件扫描成电脑图片格式,然后转换成的结果,提取里面的文字就相当于识别图片中的文字。因此,我们的工作就是将pdf转成图片,然后使用ocr工具提取图片中的文字。3.1安装相关第三方包pip3installpdf2imagepytesseract3.2导入需要的第三方库importos#Processfilesfrompdf2imageimportconvert_from_path#pdftoimageimportpytesseract#识别图片文字importcsv#处理csv文件3.3读取pdf文件,并识别内容tess_ocr(pdf_path,lang,first_page,last_page)将pdf文件拆分成图片,并提取文本写入文本文件PDF文档的页面first_page:允许设置pdftopm处理的第一页;last_page:允许设置pdftopmfmt处理的最后一页:允许指定输出格式。目前支持的格式有jpg、png、ppm;output_folder:图片保存路径deftess_ocr(pdf_path,lang,first_page,last_page):#创建一个与pdf同名的文件夹,userpw='site')#converttoimagetext=''forimginimages:text+=pytesseract.image_to_string(img,lang=lang)#使用open(r'example\data.txt''a识别图像文本',encoding='utf-8')asf:#writetxtfilef.write(text)runresult生成一个同名文件夹存放分割图片,然后提取图片文本写入data.txtimage-20211215212147760运行问题“问题1:pdf2image.exceptions.PDFInfoNotInstalledError:无法获取页数。是否已安装poppler并在PATH中?”解决办法:下载poppler。>1方法一:设置环境变量poppler/bin;>2方法二:参数指定绝对路径:images=convert_from_path(pdf_path=pdf_file_path,poppler_path=r'poppler中bin文件的位置')》问题2:pytesseract.pytesseract.TesseractNotFoundError:tesseractisnotinstalledorit's不在您的PATH中。有关更多信息,请参阅自述文件。”解决方法:下载安装tesseract-ocr并配置环境变量。3.4处理识别出的数据写入csv文件modification(infile,outfile)清理生成的文本文件infile:待处理文件的地址outfile:处理后生成的新文件地址defmodification(infile,outfile,outfile):infp=open(infile,"r",encoding='utf-8')outfp=open(outfile,"w",encoding='utf-8')lines=infp.readlines()#返回列表,包括所有线路。#依次读取每一行forliinlines:ifli.split():#str.split(str="",num=string.count(str)),过滤文件中的空行#根据识别情况下,数据清理li=li.replace('[','').replace(']','')outfp.writelines(li)infp.close()outfp.close()产生一个新的txt文件,新文件删除data.txt中的空行,将原文件中错误识别的内容替换为正确的内容。writercsv(intxt,outcsv)将文本文件按空格分列写入csv表intxt:文本文件地址outcsv:新生成的csv文件defwritercsv(intxt,outcsv):#使用newlines=''保证存储的数据是不为空确定。csvFile=open(outcsv,'a',newline='',encoding='utf-8')writer=csv.writer(csvFile)csvRow=[]f=open(intxt,'r',encoding='utf-8')forlineinf:csvRow=line.split()#使用空格作为分隔符iflen(csvRow)>1andlen(csvRow)<=3:#Constraints,视情况而定writer.writerow(csvRow)f.close()csvFile.close()结果是一个三列的csv文件,第一列是英文名,第二列是中文名,第三列是国家image-20211215204846623image-20211215204941725通过本次学习总结实现了需要从扫描文档中提取文本,并根据需要将内容写入不同格式的文档中。最初以为提取pdf的库也适合扫描,于是尝试了Pdfplumber库和PyPDF2库。实践发现Pdfplumber只能识别扫描pdf中的水印,不能识别扫描pdf,PyPDF2库报错:NotImplementedError:onlyalgorithmcode1and2aresupported。原因是加密后的pdf可能来自更高版本的acrobot,所以对应的加密算法代码为'4',而现有的pypdf2模块只支持加密算法代码为'1'或'2'的pdf加密文件。