事情的起因很简单——我电脑里有个「会议学习」文件夹,里面按年份、按会议次数分了上百个 Word 文档。某天领导问我:"之前哪几次会议提过「人工智能」来着?你帮我查查。"
我打开文件夹一看:
会议学习/ ├── 2020年/ │ ├── 第1次会议/(纪要.doc + 学习资料.docx) │ ├── 第2次会议/(资料包/一堆文件 + 总结.doc) │ ... ├── 2021年/(更多...) ├── ... └── 2025年/
我沉默了。
一个个打开搜?那得搜到什么时候。
作为一个懒人,第一反应当然是写个脚本。Python 嘛,python-docx 读 .docx,os.walk 遍历文件夹,正则匹配关键词——半小时就搞出来了。
命令行版本跑了一下,确实能用。输入「人工智能」,哗啦啦列出:
2020年/第1次会议/纪要.docx: 3次 2020年/第3次会议/学习资料.doc: 1次 2021年/第5次会议/报告.docx: 2次 ...
我美滋滋地把结果发过去,结果领导又问:"那这些文件里,哪些是学习资料类的?先只看学习资料相关的文件。"
得,还得区分文件名。
既然要筛选文件名,那就加个功能呗。思路很简单:
第一步——输入文件名关键词(比如「学习资料」),把所有名字里带这几个字的文件筛出来,列给你看,让你确认找全了没有。
第二步——确认文件范围没问题了,再输入内容关键词(比如「成功」),程序只在这批筛选过的文件里搜,而不是在全量文件里大海捞针。
这就像超市买菜:先走到「蔬菜区」(文件名筛选),再在蔬菜区里找「西红柿」(内容搜索),而不是满超市乱跑。
测试的时候好好的,结果一跑真实数据就翻车了。.docx 搜得挺准,但 .doc(老版 Word 格式)经常漏——明明文件里有那个词,就是搜不到。
排查了半天才搞明白:.doc 是微软的二进制格式,文字是嵌在一堆格式化数据里的。我之前用的「裸读」方案——直接把二进制文件当文本硬读——大部分是乱码,恰好漏掉关键词的概率很大。
解决方案倒也直接:既然 Windows 上装了 Office,那就直接调用 Word 本身来读。用 win32com 后台启动 Word,让它打开文件、提取文字、关掉。Word 自己读自己的格式,总不会出错吧?
试了一下,果然 100% 准确。
准确性解决了,新问题又来了——慢得离谱。搜 10 个 .doc 文件要等十几秒。
原因出在一个很蠢的设计上:我每读一个 .doc 文件,都走一遍这个流程:
启动 Word 程序 → 打开文档 → 读文字 → 关闭 Word 程序
10 个文件 = 启动关闭 Word 十次。Word 启动本身就要一两秒,时间全浪费在这上面了。
解决方案也很直观——Word 开一次就够了,所有文件轮流进去读,读完最后一个再关门。
就像去便利店买东西:你不会买一瓶水就出来关门,再开门进去买一包薯片,再出来关门……你肯定开着门,拿完所有东西再走。
改完之后,不管有多少个 .doc 文件,Word 只启动一次。速度直接从「等得想关电脑」变成「跟搜 .docx 一样快」。
最终版的工具长这样——一个朴实无华的 tkinter 窗口:
选好文件夹,输入关键词,回车。几秒钟后:
年份 会议 文件 出现次数 2022年 第3次会议 学习资料_AI应用.doc 3 2023年 第1次会议 学习资料_转型案例.docx 2
哪一年、哪一次会议、哪一个文件、出现了几次——清清楚楚。
说实话,这个工具本身没什么技术含量。一两百行 Python,一个 tkinter 界面,调几个现成的库。但写它的过程让我再次确认了一件事:
真正有用的工具,往往不是「技术最炫」的那个,而是刚好解决了你眼下那个烦人问题的那个。
搜几百个文件里有没有某个关键词,听起来 trivial,但手动去做就是折磨。写个脚本一小时,以后每次搜只要十秒——这个 tradeoff 怎么看都划算。
如果你也有类似的文件夹结构(年份→会议次→文档),拿去用就是了。代码放网盘了,下载下来 pip install pyinstaller python-docx pywin32 然后跑打包脚本就行。
祝你不用再手动翻上百个 Word 文档。
本文作者:haotian
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!