最近闲来无事,写了个程序用于统计蓝桥杯各组的省一
该代码是针对 2022 年蓝桥杯获奖文件写的,以后想用这份代码统计的话,可能需要改正则表达式
第13届 | A | B | C |
Python | 268 | 725 | 81 |
Java | 160 | 1192 | 271 |
C/C++ | 1050 | 4631 | 278 |
首先使用 pdfminer 编写 pdf 的解析函数,每个页面都是一个 LTPage 实例(可迭代),该对象中的 LTTextBox 实例才含有文本
import re
from pathlib import Path
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import *
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage
from tqdm import tqdm
def pdf_load(file):
with open(file, "rb") as pdf_obj:
# 初始化pdf解析设备
rsrcmgr = PDFResourceManager(caching=False)
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
pages = PDFPage.get_pages(pdf_obj)
for page in pages:
interpreter.process_page(page)
ltpage = device.get_result()
yield ltpage
然后修改 ROOT 变量,有必要的话再改正则表达式,主函数基本的流程是:
- 依次读取 ROOT 中的文件,判断是否是 pdf,而后枚举页面实例 LTPage,对其中的 LTTextBox 实例的文本进行拼接,得到该页面的所有文本
- 使用正则表达式进行匹配,累加各组的省一人数
- 将统计结果在进度条前缀处输出
# 存放 pdf 的文件夹
ROOT = Path(r'D:\Information\School Info\蓝桥杯大赛\第十三届省赛获奖')
# 正则表达式
pattern = [r'\s*'.join(['Python', '程序设计大学', i, '组', '一等奖']) for i in 'ABC'] + \
[r'\s*'.join(['Java', '软件开发大学', i, '组', '一等奖']) for i in 'ABC'] + \
[r'\s*'.join([r'C/C\+\+', '程序设计大学', i, '组', '一等奖']) for i in 'ABC']
# 计数结果
count = [0] * len(pattern)
qbar = tqdm(list(ROOT.iterdir()))
for i, file in enumerate(qbar):
if file.suffix == '.pdf':
# 枚举 pdf 的页面
for page in pdf_load(file):
# 拼接得到该页面的所有文本
text = ''
for ele in page:
if isinstance(ele, LTTextBox):
text += ele.get_text()
# 使用正则表达式进行匹配
for j, pat in enumerate(pattern):
result = re.findall(pat, text)
count[j] += len(result)
# 统计过程可视化
qbar.set_description(f'Python {count[:3]} | Java {count[3:6]} | C/C++ {count[6:]}')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)