在信息爆炸的时代,我们每天都在学习、记录、积累。无论是技术笔记、项目文档,还是读书摘要,很多人会选择用 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__、dist、build等),直接往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.walk 的 dirs 列表,原地删除要跳过的目录:
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(进阶)
结合 markdown 和 weasyprint 库,可一键导出美观的 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}")
现在,就去试试吧!让你的知识,不再散落天涯。