You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多循环场景下构建Pandas DataFrame实现多PDF关键词统计报告并导出CSV的方法

多循环场景下构建Pandas DataFrame实现多PDF关键词统计报告并导出CSV的方法

我完全理解你的需求——要批量处理多个PDF文件,统计每个PDF里来自不同关键词文本文件的关键词总出现次数,最后生成规整的表格报告并导出为CSV。你已经搞定了核心的关键词统计逻辑,现在卡在了如何用Pandas把这些零散的统计结果结构化对吧?别担心,咱们一步步来解决这个问题。

核心思路梳理

首先得把每一条统计结果(PDF文件名、关键词文件名、总次数)统一收集起来,存成结构化的列表;等所有循环跑完,再用这个列表构建Pandas DataFrame;最后把DataFrame调整成你想要的「行是PDF、列是关键词文件」的格式,再导出CSV就大功告成了。

修改后的完整代码(带详细注释)

import fitz
import glob
import pandas as pd

def keyword_finder():
    # 初始化空列表,用来存储所有统计结果
    results = []
    
    # 遍历当前目录下所有PDF文件
    for pdf_file in glob.glob('*.pdf'):
        # 用with语句打开PDF,自动处理文件关闭,更安全
        with fitz.open(pdf_file) as document:
            document_pages = document.page_count
            
            # 遍历当前目录下所有关键词文本文件
            for text_file in glob.glob('*.txt'):
                occurrences_sdg = []
                
                # 同样用with语句打开关键词文件,避免手动关闭的麻烦
                with open(text_file, 'r') as inputs:
                    keywords_list = inputs.read()
                    # 拆分关键词,同时过滤空字符串(处理txt里的空行或首尾空格)
                    keywords_list_separated = [kw.strip() for kw in keywords_list.split('\n') if kw.strip()]
                
                # 遍历每个关键词,统计在PDF中的总出现次数
                for keyword in keywords_list_separated:
                    occurrences_keyword = []
                    for page in range(document_pages):
                        text_per_page = document.load_page(page)
                        # 统计当前关键词在该页的出现次数
                        keyword_sum = len(text_per_page.search_for(keyword))
                        occurrences_keyword.append(keyword_sum)
                    # 累加该关键词在整个PDF的总次数
                    occurrences_sdg.append(sum(occurrences_keyword))
                
                # 计算当前关键词文件在该PDF的总出现次数
                total_occurrences = sum(occurrences_sdg)
                # 把这条结果存入列表,后续用来构建DataFrame
                results.append({
                    'PDF文件名': pdf_file,
                    '关键词文件': text_file,
                    '总出现次数': total_occurrences
                })
    
    # 用收集到的结果构建基础DataFrame
    df = pd.DataFrame(results)
    
    # 转换成你想要的格式:行是PDF文件名,列是关键词文件,值是对应总次数
    # 用fillna(0)把无匹配的情况填充为0,更直观
    report_df = df.pivot(index='PDF文件名', columns='关键词文件', values='总出现次数').fillna(0)
    
    # 打印预览报告
    print(report_df)
    
    # 导出为CSV文件,指定utf-8-sig避免Excel打开中文乱码
    report_df.to_csv('关键词统计报告.csv', encoding='utf-8-sig')
    print("报告已成功导出为 关键词统计报告.csv")

# 调用函数执行统计
keyword_finder()

关键步骤说明

  1. 结果结构化收集:用results列表存储每一条统计数据,每条数据是包含三个核心信息的字典,后续构建DataFrame时会自动识别列名,非常省心。
  2. 文件处理优化:全程用with语句打开文件,不用手动调用close(),避免因异常导致文件未关闭的问题。
  3. 关键词清洗:通过列表推导式过滤空字符串,解决了txt文件中空行、首尾空格带来的无效关键词问题。
  4. 格式转换:用pivot方法把长格式的DataFrame转换成你需要的宽格式,完美匹配你想要的报表样式;fillna(0)让无匹配的情况显示为0,逻辑更清晰。
  5. CSV导出优化:指定encoding='utf-8-sig',确保导出的CSV用Excel打开时不会出现中文乱码。

额外小提示

  • 如果需要大小写不敏感匹配,可以把search_for方法改成text_per_page.search_for(keyword, case_sensitive=False)
  • 如果PDF是扫描件(图片格式内容),PyMuPDF无法提取文本,这种情况需要搭配OCR工具(比如pytesseract)先识别文本再统计。

备注:内容来源于stack exchange,提问作者frexus

火山引擎 最新活动