如何用Python调用Pandoc按README顺序将Markdown合并转成DOCX
按README指定顺序合并Markdown文档为DOCX
问题背景
你的项目结构如下:
Project: ├── img ├── docs └── README.md
README.md通过链接定义了文档的规范阅读顺序,但原脚本直接遍历docs目录收集文件,完全忽略了README指定的顺序,也未处理重复引用的文件。
解决方案
核心思路是从README.md中提取所有链接指向的文档路径,严格遵循原顺序,去重后传给pandoc执行合并。
实现步骤
- 读取README.md内容,用正则匹配所有
[xxx](path)格式的链接路径 - 统一路径格式(去掉开头的
/,确保为相对项目根目录的路径) - 过滤目标文件(仅保留Markdown文件,可按需调整)
- 去重处理,避免重复合并同一文件
- 调用pandoc时指定资源路径,确保文档内的图片能正常加载
完整Python脚本
import os import re def get_ordered_files_from_readme(readme_path): # 读取README内容 with open(readme_path, 'r', encoding='utf-8') as f: content = f.read() # 匹配所有Markdown链接的路径部分 pattern = re.compile(r'\[.*?\]\((.*?)\)') all_paths = pattern.findall(content) ordered_files = [] seen_files = set() for path in all_paths: # 统一路径格式,去除开头的/ cleaned_path = path.lstrip('/') # 仅处理Markdown文件,若需包含其他格式可移除该判断 if cleaned_path.endswith('.md'): # 验证文件存在性 if os.path.exists(cleaned_path): # 去重,避免重复添加 if cleaned_path not in seen_files: ordered_files.append(cleaned_path) seen_files.add(cleaned_path) return ordered_files if __name__ == '__main__': # 项目根目录,若脚本不在Project下运行,需改为绝对路径 project_root = '.' readme_path = os.path.join(project_root, 'README.md') output_file = 'output.docx' # 获取按README顺序排列的文件列表 markdown_files = get_ordered_files_from_readme(readme_path) if not markdown_files: print('未找到有效Markdown文件') exit(1) # 构造pandoc命令,指定资源路径确保图片正常加载 pandoc_cmd = f'pandoc --resource-path="{project_root}" {" ".join(markdown_files)} -o {output_file}' os.system(pandoc_cmd) print(f'合并完成,输出文件:{output_file}')
关键说明
- 路径统一:通过
lstrip('/')处理链接中的绝对路径(如/docs/331.md),避免文件查找失败 - 去重逻辑:用集合
seen_files记录已添加的文件,防止重复合并同一文档 - 资源路径:
--resource-path参数告诉pandoc从项目根目录查找图片等资源,确保文档内的图片能正常渲染 - 格式过滤:若需要合并
a_shorts.en这类非Markdown文件,移除endswith('.md')的判断即可
内容的提问来源于stack exchange,提问作者M.Kara
相关产品推荐
相关产品推荐

