115 lines
3.9 KiB
Python
115 lines
3.9 KiB
Python
import sys
|
||
from pathlib import Path
|
||
|
||
|
||
# 分隔线定义,保持与你示例中的长度一致
|
||
HEADER_LINE_SHORT = "=" * 22 # ======================
|
||
HEADER_LINE_LONG = "=" * 26 # ==========================
|
||
MIDDLE_LINE = "-" * 31 # -------------------------------
|
||
|
||
|
||
def merge_md_and_json(directory: str, output_file: str = "merged_output.txt") -> None:
|
||
"""
|
||
在指定目录下,将 .md 和 .json 文件按规则合并输出到一个文件中。
|
||
|
||
规则:
|
||
- 遍历所有 .md 文件;
|
||
- 对每个 .md 文件,取“文件名(不含扩展名)中第一个空格前的字符串”作为 key;
|
||
- 在同目录下按 key 精确匹配 .json 的“文件名(不含扩展名)”;
|
||
- 只有存在匹配的 json 文件时才合并;找不到 json 的 md 文件丢弃。
|
||
"""
|
||
base_dir = Path(directory).resolve()
|
||
if not base_dir.is_dir():
|
||
raise NotADirectoryError(f"指定路径不是目录: {base_dir}")
|
||
|
||
# 收集所有 json 文件,以“文件名(不含扩展名)”为 key
|
||
json_map = {}
|
||
for json_path in base_dir.glob("*.json"):
|
||
key = json_path.stem # 文件名不含扩展名
|
||
json_map[key] = json_path
|
||
|
||
# 收集所有 md 文件
|
||
md_files = list(base_dir.glob("*.md"))
|
||
# 为了输出顺序稳定,按文件名排序
|
||
md_files.sort(key=lambda p: p.name)
|
||
|
||
output_path = base_dir / output_file
|
||
|
||
with output_path.open("w", encoding="utf-8") as out_f:
|
||
first_section_written = False
|
||
|
||
for md_path in md_files:
|
||
# 取 md 文件名(不含扩展名)第一个空格前部分作为 key
|
||
md_stem = md_path.stem
|
||
key = md_stem.split(" ", 1)[0] # 仅按第一个空格切分
|
||
|
||
json_path = json_map.get(key)
|
||
if json_path is None:
|
||
# 没有匹配到 json,丢弃此 md
|
||
continue
|
||
|
||
# 读 md 内容
|
||
with md_path.open("r", encoding="utf-8") as f_md:
|
||
md_content = f_md.read()
|
||
|
||
# 读 json 内容
|
||
with json_path.open("r", encoding="utf-8") as f_json:
|
||
json_content = f_json.read()
|
||
|
||
# 如果不是第一段,可以视需要在前面插入一个空行,避免段落粘连
|
||
if first_section_written:
|
||
out_f.write("\n")
|
||
first_section_written = True
|
||
|
||
# 写入合并内容
|
||
# 结构:
|
||
# ======================
|
||
# XXX.md
|
||
# ======================
|
||
# <md 内容>
|
||
#
|
||
# -------------------------------
|
||
# 示例数据:
|
||
# <json 内容>
|
||
#
|
||
# ==========================
|
||
# <下一个 md 文件名>
|
||
# ==========================
|
||
|
||
# 头部(短等号)
|
||
out_f.write(f"{HEADER_LINE_SHORT}\n")
|
||
out_f.write(f"{md_path.name}\n")
|
||
out_f.write(f"{HEADER_LINE_SHORT}\n")
|
||
out_f.write(md_content.rstrip() + "\n") # 去掉尾部多余换行,统一在后面加一个
|
||
|
||
out_f.write("\n")
|
||
out_f.write(f"{MIDDLE_LINE}\n")
|
||
out_f.write("示例数据:\n")
|
||
out_f.write(json_content.rstrip() + "\n")
|
||
|
||
# 底部(长等号)
|
||
out_f.write("\n")
|
||
out_f.write(f"{HEADER_LINE_LONG}\n")
|
||
out_f.write(f"{md_path.name}\n")
|
||
out_f.write(f"{HEADER_LINE_LONG}\n")
|
||
|
||
print(f"合并完成,输出文件:{output_path}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
"""
|
||
用法示例:
|
||
python merge_md_json.py /path/to/dir
|
||
python merge_md_json.py /path/to/dir result.txt
|
||
"""
|
||
if len(sys.argv) < 2:
|
||
print("用法: python merge_md_json.py <目录路径> [输出文件名]")
|
||
sys.exit(1)
|
||
|
||
input_dir = sys.argv[1]
|
||
if len(sys.argv) >= 3:
|
||
output_name = sys.argv[2]
|
||
else:
|
||
output_name = "merged_output.txt"
|
||
|
||
merge_md_and_json(input_dir, output_name) |