# Python实现文件内容关键词统计与可视化工具


在文档分析、内容审计、文本挖掘等场景中,我们常常需要快速了解特定关键词在多个文本文件中的分布情况。本文将介绍如何使用Python开发一个文件内容关键词统计与可视化工具,实现对指定目录下文本文件的关键词统计,并通过柱状图直观展示关键词在不同文件中的分布规律。

背景与价值

该工具支持以下功能:
– 遍历指定目录下的所有.txt.md文件;
– 统计用户输入的多个关键词的出现次数(忽略大小写);
– 格式化输出统计表格;
– 生成柱状图可视化关键词分布。

通过该项目,你将学习到:
文件操作:使用osglob模块遍历目录、读取文本文件;
字符串处理:关键词的大小写不敏感匹配、子字符串统计;
数据结构:使用字典存储统计结果,构建表格数据;
可视化:使用matplotlib绘制自定义柱状图,解决中文显示问题。

实现思路

  1. 文件遍历:使用glob模块匹配指定目录下的所有.txt.md文件。
  2. 关键词处理:将文件内容和关键词统一转为小写,实现大小写不敏感的统计(如Pythonpython视为同一关键词)。
  3. 统计逻辑:遍历每个文件的内容,统计每个关键词的子字符串出现次数(可根据需求改为全词匹配)。
  4. 数据展示
    • 表格输出:使用格式化字符串输出统计结果;
    • 可视化:使用matplotlib绘制柱状图,自定义颜色、标签和图例,支持中文显示。

代码实现

下面是完整的Python实现代码,包含详细注释:

import os
import glob
import matplotlib.pyplot as plt

def get_files(directory):
    """获取指定目录下的所有txt和md文件"""
    file_patterns = [os.path.join(directory, ext) for ext in ['*.txt', '*.md']]
    files = []
    for pattern in file_patterns:
        files.extend(glob.glob(pattern))
    return files

def count_keywords(files, keywords):
    """统计每个关键词在每个文件中的出现次数(大小写不敏感,子字符串匹配)"""
    results = {}  # 存储结构:{关键词: {文件名: 次数}}
    for keyword in keywords:
        results[keyword] = {}  # 初始化关键词的统计字典
    for file_path in files:
        # 读取文件内容并转为小写
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read().lower()
        filename = os.path.basename(file_path)  # 提取文件名
        for keyword in keywords:
            keyword_lower = keyword.lower()  # 关键词转为小写
            # 统计子字符串出现次数
            count = content.count(keyword_lower)
            results[keyword][filename] = count
    return results

def print_table(results, files):
    """格式化输出统计结果(Markdown表格)"""
    filenames = [os.path.basename(f) for f in files]
    headers = ['关键词'] + filenames
    print('|' + '|'.join(headers) + '|')
    print('|' + '|'.join(['---'] * len(headers)) + '|')
    for keyword, counts in results.items():
        row = [keyword] + [str(counts.get(fn, 0)) for fn in filenames]
        print('|' + '|'.join(row) + '|')

def plot_results(results, files):
    """使用matplotlib绘制关键词分布柱状图"""
    # 解决中文显示问题
    plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
    plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题
    filenames = [os.path.basename(f) for f in files]
    keywords = list(results.keys())
    n_files = len(filenames)
    n_keywords = len(keywords)
    x = range(n_files)  # x轴位置(文件名的索引)
    bar_width = 0.8 / n_keywords  # 调整柱子宽度,避免多关键词时重叠

    # 自定义颜色(可扩展)
    colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd']

    for i, keyword in enumerate(keywords):
        counts = [results[keyword].get(fn, 0) for fn in filenames]
        # 计算每个关键词的柱子位置,使组内居中
        bar_pos = [pos + i * bar_width - (n_keywords - 1) * bar_width / 2 for pos in x]
        plt.bar(bar_pos, counts, width=bar_width, label=keyword, color=colors[i % len(colors)])

    # 设置x轴标签(文件名),旋转45度提升可读性
    plt.xticks(x, filenames, rotation=45, ha='right')
    plt.xlabel('文件名')
    plt.ylabel('出现次数')
    plt.title('关键词在文件中的分布')
    plt.legend()
    plt.tight_layout()  # 自动调整布局,防止标签截断
    plt.show()

def main():
    """主函数:串联用户输入、文件遍历、统计、输出、可视化流程"""
    # 获取用户输入
    directory = input("请输入目标目录的路径(例如:./test_files):")
    keyword_input = input("请输入关键词(以逗号分隔,例如:python,数据,分析):")
    keywords = [k.strip() for k in keyword_input.split(',')]

    if not keywords:
        print("错误:请输入至少一个关键词!")
        return

    # 遍历目标目录的文件
    files = get_files(directory)
    if not files:
        print(f"错误:在目录 {directory} 中未找到txt或md文件!")
        return

    # 执行关键词统计
    results = count_keywords(files, keywords)

    # 输出统计表格
    print("\n=== 关键词统计结果(Markdown表格)===")
    print_table(results, files)

    # 绘制可视化图表
    plot_results(results, files)

if __name__ == "__main__":
    main()

运行示例

假设目录./test_files包含以下文件:
file1.txt"Python是一种编程语言,常用于数据分析和数据可视化。"
file2.md"本文将分析Python在数据科学中的应用,数据处理是核心环节。"
file3.txt"数据分析的步骤包括:数据收集、数据清洗、数据分析。"

输入

请输入目标目录的路径:./test_files
请输入关键词:python,数据,分析

输出表格

|关键词|file1.txt|file2.md|file3.txt|
|---|---|---|---|
|python|1|1|0|
|数据|2|1|2|
|分析|1|1|2|

可视化图表
横轴为文件名(file1.txtfile2.mdfile3.txt),纵轴为出现次数,不同颜色代表不同关键词,直观展示分布。

常见问题解决

  1. 中文显示乱码:确保matplotlib的字体设置正确(代码中已配置"SimHei"等中文字体),并保证系统安装了对应字体。
  2. 文件读取错误:检查文件路径是否正确、文件编码是否为UTF-8(代码中指定encoding='utf-8')。
  3. 统计结果异常:确认关键词输入格式(无多余空格),或调整统计逻辑(如改为全词匹配)。

通过该工具,你可以快速分析文本文件中的关键词分布,为文档审计、内容挖掘等场景提供数据支持。代码结构清晰,易于扩展,欢迎根据需求优化功能!


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注