一、需求说明公司每周各部门都有各自的周报,是word编写的,docx格式的。最近有个需求,就是要从以往周报中搜索相关的信息。其实说白了就是在各个独立的word文件中搜索关键字。这个和只搜索文件名的不同点大家应该也发现了,就是要深入到word文件里面去进行搜索。这个需求以前我也有,因为我有使用word记录工作的习惯,尤其是板卡问题的排查记录。但是真需要复查的时候,却不知道写到哪个文件里了,有的时候就要从头到尾挨个点开来查找。当时研究了一些软件和方法,没有很好的解决。(dngrep也是个不错的选择,大家可以尝试,下面讲述我的另一种解决方案)最近一年我放弃了word,采用了印象笔记来进行记录,这个查找的问题就得到了很好的结局。但是公司周报没有办法上到云,只能离线。所以这种云笔记的方式是没有办法解决周报搜索的需求的。所以需要找到一款离线的笔记软件。二、笔记软件安装及说明离线笔记软件多为开源的,并且有很多。离线笔记软件里我选择的是“思源笔记”。思源笔记支持windows,MacOS,Linux系统,因为我们公司电脑平台和系统很杂,这点思源软件很友好。同时支持完全离线使用,同时也支持端到端加密同步。下载地址:https://b3log.org/siyuan/download.html我是windows系统,下载到自己电脑后,需要用“管理员身份运行”。打开后需要新建笔记本。在“文档树”→“更多”→“新建笔记本”→取名“周报”→“确定”。查看“周报”→“更多”→“导入”。发现笔记本是可以导入的。这里就关键了,可以导入“SiYuan.sy.zip”,这说明如果别人把文件打包整理好,那么我们是可以坐享其成的,把打包好文件导入。其次,可以导入“Markdown文档”,也就是说我们可以把自己做好的markdown文档导入进来。还可以导入“Markdown文件夹”,也就是说,我们如果一个文件夹内都是markdown文件,那么就不用一个一个导入了,直接指定文件夹就可以了。那么这里我们就基本清晰了,如果没有别人打包好的文件,那么就要自己搞markdown文件,markdown一种轻量级标记语言,word通过工具是可以转换成markdown文件的。那么我们现在的任务就是把上面的周报docx文件,批量的转换为markdown文件就好了。三、docx批量转换为markdown文件3.1 python脚本这里感谢csdn博主“痴人说梦梦中人”的python脚本。原文如下:文章链接:https://blog.csdn.net/qq_38963246/article/details/119586221之前用有道云记笔记,笔记导出格式基本都为docx格式,有道笔不能批量导出,另外就是时常卡顿,就想着换个markdown编辑器直接保存本地,前后尝试了notepad++插件,Atom,MarkdownPad,Cmd Markdown,最终还是选择了Typora,大纲和文件树是真的舒服,就是启动太慢。有道云笔记导出格式都是word类型的,数量还不少,只好搞个脚本进行格式转换了。repo:https://github.com/SevenC-base/docx_to_markdown效果还行,不求美观之类的,能跑就行了1.简介一个辅助脚本,利用工具pandoc,以单线程的方式将目录下所有docx文件转为markdown格式。pandocx:https://github.com/jgm/pandoc/releases/tag/2.14.12.使用配置:修改如下配置:# 配置pandoc 路径pandoc_path='C:\\Users\\Administrator\\Downloads\\pandoc.exe'# 配置docx文件存在的路径,会遍历该路径下的所有docx文件dirctory='D:\\笔记\\'# 配置图片存储路径images_store_path='D:\\笔记\\images\\'3.运行结果如下生成目录就是原来的目录,想筛选的话就文件夹搜索.md就好了。其Python脚本源码:#!/usr/bin/env python# -*- coding:UTF-8 -*-# 2021/08/10 周二 15:23:14# By Hasaki-h1import os, sys, subprocess, uuiddef get_file_list(directory): '''单独一个目录''' files_list=[] files_path_list=[] files_p_list=[]if os.path.exists (directory): directory_n=directory else: print ('%s 不是一个有效的目录!!!' % directory) sys.exit ()# 遍历目录下读取可读文件 all_files_directory=os.walk (directory_n, topdown=True, followlinks=True) for root, dirs, files in all_files_directory: # 获取文件路径 for f_name in files: if '.docx' in f_name: # print(f_name) file_path_d=os.path.join (root, f_name) file_path_m=os.path.join (root, f_name.replace ('.docx', '.md')) files_path_list.append (file_path_d) files_p_list.append (file_path_m)return files_path_list, files_p_listdef convert_md(pandoc_path, f_docx, f_md, images_store_p): try: image_store_path_create=images_store_p + str (f_docx.split ('\\')[-1]).replace ('.docx', '') + str ( uuid.uuid4 ()) cmd=pandoc_path + ' \'{}\' -f docx -t markdown -o \'{}\' --extract-media=\'{}\''.format (f_docx, f_md, image_store_path_create) res=subprocess.Popen (cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) sout, serr=res.communicate () res.wait () sout.decode ('gbk') except Exception as e: serr.decode ('gbk') finally: passdef main(pandoc_path, dirctory, images_store_path): fpl_docx, fpl_md=get_file_list (dirctory) print ('-----------------起飞------------------') for fpl_d in fpl_docx: progress='{:.2f}%'.format (((fpl_docx.index (fpl_d) + 1) / len (fpl_docx)) * 100) # print(fpl_d,fpl_md[fpl_docx.index(fpl_d)]) convert_md (pandoc_path, fpl_d, fpl_md[fpl_docx.index (fpl_d)], images_store_path) print ('? 进度:{} ------ {} ->>>--->>>转换完成!'.format (progress, str (fpl_d.split ('\\')[-1])))if __name__=='__main__': # 配置pandoc 路径 pandoc_path='C:\\Users\\Administrator\\Downloads\\pandoc.exe' # 配置docx文件路径,会遍历该路径下的所有docx文件 dirctory='D:\\笔记\\' # 配置图片存储路径 images_store_path='D:\\笔记\\images\\'main(pandoc_path, dirctory, images_store_path)3.2 脚本依赖安装用这个脚本,需要在windows系统上安装pandoc和python。先安装pandoc,下载地址:https://pandoc.org/installing.html。(建议:pandoc安装目录中没有空格等比较方便,我直接把pandoc装到了C:\ProgramFiles\Pandoc文件下)装完可以在cmd中,看一下是否运行正常了。能看到版本信息就可以了。>pandoc --version再安装python。在cmd中输入版本查看,看自己电脑是否有python。>python --version要是没有版本号,那么就说明电脑里没有python。那么就直接输入>python,windows会自动跳到应用商店python的应用安装界面。跳转了就安装就行了,我下面截图是我已经点完安装,且安装完的图。要是没安装就会有个“安装”的钮,点它就行了。3.3 直接调用pandoc命令尝试转换那么首先尝试把一份周报.docx格式(就是下面的a.docx,我为了好敲命令,重命名了一份周报,免得敲那么长的文件名了)转为.md格式。pandoc操作手册MANUAL.pdf:https://pandoc.org/MANUAL.pdf因为在cmd内调用pandoc命令就可以直接转换文件。我们使用cd命令进入到周报所在的目录“2020年”里面,使用命令“>pandoc a.docx -o a.md”转换a.docx文件。先不用脚本,手动的先转换试试。但是因为周报有边框,所以输出效果很不好,转换结果是这样的:啥都看不了,所以需要制定输出格式,根据MANUAL.pdf手册里对输入输出的参数说明,-f是输入,-t是输出。经过各种尝试,输出格式配置为xwiki时显示且后期搜索效果最好。所以脚本命令使用:>pandoc -f docx -t xwiki a.docx -o a.md3.4 python脚本修改那么就改上面的命令修改csdn博主的脚本,现在文件目录是这样的:修改docx2md.py脚本。配置pandoc的安装路径,pandoc_path为“C:\\ProgramFiles\\Pandoc\\pandoc.exe”(前面说了建议pandoc安装路径没有空格,就是这里简单些)。配置需要转换的docx文件存放的路径dirctory为“E:\\markdown\\2020年\\”会遍历该路径下的所有docx文件(因为上面的文件存储路径有子文件夹,所以2020年、2021年、2022年三个文件夹这个脚本要改三次,先改为“E:\\markdown\\2020年\\”再改为“E:\\markdown\\2021年\\”,再改为“E:\\markdown\\2022年\\”)。Word中的图片我没有另存储,也就是markdown文件为纯文本的,所以images_store_path路径我没有改动,因为下面转换命令里我就没涉及image。Pandoc转换命令那里,即脚本第42、43行改为:cmd=pandoc_path + ' -f docx -t xwiki \'{}\' -o \'{}\''.format (f_docx, f_md)3.5 python脚本执行在cmd中执行命令>python docx2md.py(因为上面配置docx文件存放dirctory的路径时改了三次,即“E:\\markdown\\2020年\\”、“E:\\markdown\\2021年\\”、“E:\\markdown\\2022年\\”,所以每改一次要执行一次>python docx2md.py命令才能对子文件的转换)四、markdown文件夹导入在思源笔记里导入文件夹,下面以导入2021年的为例:选择笔记本→“更多”→“导入”→“Markdown文件夹”→选择存放md文件的文件夹。五、笔记本导出软件可以将自己的笔记本打包转出,“更多”→“导出”→“SiYuan.sy.zip”,点击后软件会调用浏览器的下载器,保存笔记本名字的.sy.zip文件。我这里就是“周报.sy.zip”。我把“周报.sy.zip”剪切到“E:\markdown”文件夹下。六、笔记本导入笔记本文件的导入。新建笔记本→“更多”→“导入”→“SiYuan.sy.zip”→找到.sy.zip文件(我这里为E:\markdown\周报.sy.zip)。七、笔记本搜索功能选中笔记本→“更多”→“搜索”→填写要搜的关键词→点击搜索结果可以预览上下文。