多循环场景下构建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()
关键步骤说明
- 结果结构化收集:用
results列表存储每一条统计数据,每条数据是包含三个核心信息的字典,后续构建DataFrame时会自动识别列名,非常省心。 - 文件处理优化:全程用
with语句打开文件,不用手动调用close(),避免因异常导致文件未关闭的问题。 - 关键词清洗:通过列表推导式过滤空字符串,解决了txt文件中空行、首尾空格带来的无效关键词问题。
- 格式转换:用
pivot方法把长格式的DataFrame转换成你需要的宽格式,完美匹配你想要的报表样式;fillna(0)让无匹配的情况显示为0,逻辑更清晰。 - 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




