You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python调用Pandoc按README顺序将Markdown合并转成DOCX

按README指定顺序合并Markdown文档为DOCX

问题背景

你的项目结构如下:

Project:
├── img
├── docs
└── README.md

README.md通过链接定义了文档的规范阅读顺序,但原脚本直接遍历docs目录收集文件,完全忽略了README指定的顺序,也未处理重复引用的文件。

解决方案

核心思路是从README.md中提取所有链接指向的文档路径,严格遵循原顺序,去重后传给pandoc执行合并。

实现步骤

  1. 读取README.md内容,用正则匹配所有[xxx](path)格式的链接路径
  2. 统一路径格式(去掉开头的/,确保为相对项目根目录的路径)
  3. 过滤目标文件(仅保留Markdown文件,可按需调整)
  4. 去重处理,避免重复合并同一文件
  5. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:15:24