自动聚合你的知识库:用 Python 脚本一键生成「我的知识点汇总.md」

53 阅读5分钟

在信息爆炸的时代,我们每天都在学习、记录、积累。无论是技术笔记、项目文档,还是读书摘要,很多人会选择用 Markdown 文件来组织自己的知识体系。但随着时间推移,这些零散的 README.md 文件可能散落在不同的文件夹中,查找和回顾变得越来越困难。

有没有一种方法,能自动把所有你关心的知识点“聚沙成塔”,生成一份完整的汇总文档?答案是肯定的!今天,我就带你解析一段简洁而实用的 Python 脚本,它能自动遍历指定目录,提取所有 README.md 文件内容,并合并成一份结构清晰的「我的知识点汇总.md」。


一、脚本功能概览

这段脚本的核心目标非常明确:

只从你指定的文件夹中,找出所有的 README.md 文件,按路径顺序拼接到一个汇总 Markdown 文件中。

它具备以下特性:

  • 精准控制范围:只扫描你指定的文件夹(如 "ai")。
  • 智能排除干扰项:自动跳过 node_modules.git、临时文件等无关目录。
  • 保留原始结构:每个 README.md 前会标注其完整路径,便于溯源。
  • 自动生成汇总文档:输出为 我的知识点汇总.md,开箱即用。

二、代码逐段解析

1. 导入模块与核心配置

import os

# -------------------------- 核心配置:改这里就行 --------------------------
MY_FOLDERS = ["ai"]  # 替换成你的知识点文件夹
EXCLUDE_LIST = ["node_modules", ".git", "临时文件"]
# ------------------------------------------------------------------------
  • os 模块用于操作系统路径操作。
  • MY_FOLDERS 是你要扫描的根目录列表。比如你有一个 ai/ 文件夹专门存放人工智能相关的笔记,就填 "ai"
  • EXCLUDE_LIST 定义了要跳过的目录名或关键词(支持模糊匹配)。虽然当前脚本未显式使用该列表进行过滤(稍后我们会优化),但预留了扩展空间。

💡 提示:如果你希望排除更多内容(如 __pycache__distbuild 等),直接往 EXCLUDE_LIST 里加即可。


2. 初始化汇总文件

summary_file = "我的知识点汇总.md"
with open(summary_file, "w", encoding="utf-8") as f:
    f.write("# 我的知识点汇总\n\n")
  • 创建或清空目标文件 我的知识点汇总.md
  • 写入主标题,作为文档的开头。

3. 遍历指定文件夹,提取 README.md

for folder in MY_FOLDERS:
    if not os.path.exists(folder):
        print(f"文件夹 {folder} 不存在,跳过")
        continue
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file.lower() == "readme.md":
                file_path = os.path.join(root, file)
                # 写入标题(路径)
                with open(summary_file, "a", encoding="utf-8") as f:
                    f.write(f"## {file_path}\n")
                # 读取并追加内容
                with open(file_path, "r", encoding="utf-8") as f_read:
                    content = f_read.read()
                    with open(summary_file, "a", encoding="utf-8") as f_write:
                        f_write.write(content + "\n\n---\n\n")
  • 使用 os.walk() 递归遍历每个 MY_FOLDERS 中的子目录。
  • 只处理文件名为 readme.md(不区分大小写)的文件。
  • 每个文件的内容前插入一个二级标题 ## 文件路径,方便定位。
  • 内容后添加分隔线 ---,提升可读性。

4. 完成提示

print(f"✅ 汇总完成!已生成文件:{summary_file}")

运行结束后,终端会友好地告诉你任务已完成。


三、使用场景举例

场景 1:个人知识管理系统(PKM)

你有一个 notes/ 目录,结构如下:

notes/
├── ai/
│   ├── llm/
│   │   └── README.md
│   └── computer-vision/
│       └── README.md
├── web/
│   └── react/
│       └── README.md
└── tools/
    └── git/
        └── README.md

只需将 MY_FOLDERS = ["notes"],运行脚本,就能得到一份包含所有技术笔记的完整文档,适合定期归档或分享。

场景 2:项目文档聚合

你在多个微服务项目中都写了 README.md 描述接口或部署方式。可以用此脚本快速生成“全系统文档快照”,便于新人上手。


四、潜在优化建议

虽然当前脚本已很实用,但仍有提升空间:

✅ 1. 实现 EXCLUDE_LIST 的实际过滤

当前脚本定义了 EXCLUDE_LIST,但并未使用。我们可以修改 os.walkdirs 列表,原地删除要跳过的目录:

for root, dirs, files in os.walk(folder):
    # 原地过滤 dirs,避免进入排除目录
    dirs[:] = [d for d in dirs if not any(ex in d for ex in EXCLUDE_LIST)]
    ...

这样能显著提升性能,尤其在大型项目中。

✅ 2. 支持更多文件名(如 index.md、note.md)

可将判断条件改为:

if file.lower() in ["readme.md", "index.md", "note.md"]:

或通过配置项自定义。

✅ 3. 添加时间戳或版本信息

在汇总文件头部加入生成时间:

from datetime import datetime
f.write(f"# 我的知识点汇总\n> 生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")

✅ 4. 输出为 HTML 或 PDF(进阶)

结合 markdownweasyprint 库,可一键导出美观的 PDF 报告。


五、总结

这个不到 50 行的 Python 脚本,体现了“小工具解决大问题”的哲学。它不依赖任何第三方库,仅用标准库就实现了知识聚合的自动化,非常适合嵌入到你的日常工作流中。

你可以:

  • 每周运行一次,生成周报式知识快照;
  • 在 Git 提交前自动更新汇总文档;
  • 结合 Obsidian、Logseq 等工具,打造闭环知识体系。

真正的生产力,往往藏在这些不起眼的自动化脚本里。


📌 附:完整优化版脚本(含 EXCLUDE_LIST 过滤)

import os
from datetime import datetime

MY_FOLDERS = ["ai"]
EXCLUDE_LIST = ["node_modules", ".git", "临时文件", "__pycache__"]

summary_file = "我的知识点汇总.md"

# 初始化
with open(summary_file, "w", encoding="utf-8") as f:
    f.write("# 我的知识点汇总\n")
    f.write(f"> 自动生成于:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")

for folder in MY_FOLDERS:
    if not os.path.exists(folder):
        print(f"⚠️ 文件夹 {folder} 不存在,跳过")
        continue

    for root, dirs, files in os.walk(folder):
        # 关键:原地修改 dirs,跳过排除项
        dirs[:] = [d for d in dirs if not any(ex in d for ex in EXCLUDE_LIST)]
        
        for file in files:
            if file.lower() == "readme.md":
                file_path = os.path.join(root, file)
                print(f"📝 正在处理: {file_path}")
                
                with open(summary_file, "a", encoding="utf-8") as f:
                    f.write(f"## `{file_path}`\n\n")
                
                try:
                    with open(file_path, "r", encoding="utf-8") as f_read:
                        content = f_read.read()
                        with open(summary_file, "a", encoding="utf-8") as f_write:
                            f_write.write(content + "\n\n---\n\n")
                except Exception as e:
                    with open(summary_file, "a", encoding="utf-8") as f:
                        f.write(f"❌ 读取失败: {e}\n\n---\n\n")

print(f"✅ 汇总完成!已生成文件:{summary_file}")

现在,就去试试吧!让你的知识,不再散落天涯。