蓝桥杯 省一人数统计 Python 实现

最近闲来无事,写了个程序用于统计蓝桥杯各组的省一

该代码是针对 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:]}')

猜你喜欢

转载自blog.csdn.net/qq_55745968/article/details/125168840