栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

该代码是针对 2022 年蓝桥杯获奖文件写的,以后想用这份代码统计的话,可能需要改正则表达式

第13届ABC
Python26872581
Java1601192271
C/C++10504631278

首先使用 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:InformationSchool 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:]}')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953899.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号