达叔926词汇pdf单词提取、保存

需求:将pdf中的单词,通过正则表达式提取,保存到excel将excel文件另存为.csv格式,导入到anki制成卡牌学习。

注:因为本人是业余,水平有限,如果讲解有错误,欢迎指正。另外,本文使用的926词汇pdf资料请自行准备。

目录

全部代码

代码效果 

提前准备

pdf文件与内容导入

pdf文件导入

pdf内容导入

正则匹配|内容筛选

将结果存入Excel


全部代码

import pdfplumber
import re
import openpyxl

ad=[]
k=[]
for l in range(1,19):
    adress=f"D:/BaiduNetdiskDownload/李达926逐词精讲-词汇{l}笔记.pdf"
    ad.append(adress)
    pdf = pdfplumber.open(adress)
    print(f'正在写入{adress}')
    for i in range(len(pdf.pages)):
       page = pdf.pages[i]
       wk = page.extract_text()
       k.append(wk)
wb = ''.join(k)
wb = wb.replace('改变就橙啦橙啦,大学生学习成长平台'," ")
num = re.findall('(\d+).*?\[', wb)
text = re.findall('\d+(.*?)\[', wb)
chinese = re.findall('](.*?)【真题例句',wb,re.S)   #re.S的作用是使匹配包含换行符\n、\t,即空格与换行

xs = openpyxl.Workbook()
xl = xs.active
xl.title = '达叔926'
xl['A1']='序号'
xl['B1']='英文'
xl['C1']='中文|助记'
q=2
for a,b,c in zip(num,text,chinese):
    xl.cell(q,1,a)
    xl.cell(q,2,b)
    xl.cell(q,3,c)
    q+=1
xs.save('达叔926.xlsx')

代码效果

处理的pdf内容:

达叔926词汇pdf单词提取、保存_第1张图片

 处理结果:

达叔926词汇pdf单词提取、保存_第2张图片


提前准备

import pdfplumber  #处理pdf的包
import re          #正则表达式处理包
import openpyxl    #操作excel的包

        使用的软件(IDE)是Pycharm

        系统为Windows11

        pdfplumber的安装:pip install pdfplumber

pdf文件与内容导入

pdf文件导入

ad=[]
for l in range(1,19):
    adress=f"D:/BaiduNetdiskDownload/李达926逐词精讲-词汇{l}笔记.pdf"
    ad.append(adress)
    
    

        代码中,我使用的了绝对路径。因为pdf共有18个,所以我需要for循环遍历,将文件的绝对地址通过append函数压入一个列表

达叔926词汇pdf单词提取、保存_第3张图片

pdf内容导入

k = []
pdf = pdfplumber.open(adress)         #将导入的pdf打开
    for i in range(len(pdf.pages)):   #获取pdf总页数,并遍历
       page = pdf.pages[i]            #打开pdf对应页数
       wk = page.extract_text()       #获取对应页数的文本内容
       k.append(wk)                   #将内容压入列表
wb = ''.join(k)                       #将列表的内容遍历拼接并转为字符串类型

        将pdf的全部内容压入一个列表后,通过.join函数将列表遍历拼接转为字符串类型,为接下来正则匹配做准备。

        另外如果pdf中的内容有图片或表格,那你就不能单纯的使用page.extract_text()。例如,处理pdf表格,需要使用page.extract_table()。其他具体用法请参考其它更专业的博客文章。

正则匹配|内容筛选

wb = wb.replace('改变就橙啦橙啦,大学生学习成长平台'," ") #将其他无关内容替换成空格
num = re.findall('(\d+).*?\[', wb)                     #匹配单词前的序号
text = re.findall('\d+(.*?)\[', wb)                    #匹配英文单词
chinese = re.findall('](.*?)【真题例句',wb,re.S)        #匹配中文释译和助记方法

re.S是正则的一种匹配模式,作用是防止匹配的内容中第一个就是换行符(空格、换行)而导致返回空列表。(注:正则表达式中的“.”能匹配任意字符,但换行符除外。当时没少因为这个知识点吃苦头)

改:(\d+).*?\[ 中的+是防止匹配到空格。*匹配目标出现0次或多次;+匹配目标出现1次或多次。

将结果存入Excel

xs = openpyxl.Workbook()
xl = xs.active
xl.title = '达叔926'
xl['A1']='序号'        #第一行、第一列单元格写入序号,以下作用类似
xl['B1']='英文'
xl['C1']='中文|助记'
q=2
for a,b,c in zip(num,text,chinese):
    xl.cell(q,1,a)    #通过openpyxl包的cell函数将内容写入对应的单元格;.cell(行,列,内容)
    xl.cell(q,2,b)
    xl.cell(q,3,c)
    q+=1
xs.save('达叔926.xlsx')

        这里使用的是openpyxl,具体的使用方法请参考相应的文档。

        zip函数能同时遍历三个及以上的列表,并一一对应的形成新列表。注:请保证列表的长度一致,不然会发生一些意外。

        另,生成的xlsx会保存在你的代码根目录下,如果要保存到其他地方,可以使用with方法。


总结

        其实,代码写到这里主体的功能基本实现了,但是还有很大优化空间。例如,将单词词性匹配出来,可这对我来说有一定难度,因为pdf里有很多一词多意和一个单词既能是名词又能是动词的情况。又例如将中文释义和助记方法分别匹配,等等。最后只要将excel文件另存为csv格式后导入anki(bilibili上有人讲解过)即可,那么请看看我的最终成品吧。(虽然细节处理的不好)

2022-11-15 22-03-27_x264

你可能感兴趣的:(pdf,python)