今天需要合并多个docx文档,但是有的文件夹中含有阿拉伯数字的文件名,也有中文数字的文件名,所以稍微麻烦了一点。
原本是使用的sorted+正则表达式,但是发现还是无法达到要求。可能是因为中文数字的问题,让这个方法无法正常排序吧。
from docx import Document
import os
import re
# 定义中文数字到阿拉伯数字的映射
chinese_numerals = {
'零': 0, '一': 1, '二': 2, '三': 3, '四': 4,
'五': 5, '六': 6, '七': 7, '八': 8, '九': 9,
'十': 10, '十一': 11, '十二': 12, '十三': 13, '十四': 14,
'十五': 15, '十六': 16, '十七': 17, '十八': 18, '十九': 19,
'二十': 20, '二十一': 21, '二十二': 22, '二十三': 23, '二十四': 24,
'二十五': 25, '二十六': 26, '二十七': 27, '二十八': 28, '二十九': 29,
'三十': 30
}
def chinese_to_arabic(chinese):
"""将中文数字转换为阿拉伯数字"""
return chinese_numerals.get(chinese, -1) # 返回 -1 表示未找到匹配
def natural_sort_key(filename):
"""获取文件名中的中文数字或阿拉伯数字并进行排序"""
# 先尝试匹配阿拉伯数字
match = re.search(r"第(\d+)章", filename)
if match:
arabic_num = int(match.group(1))
return arabic_num
# 如果没有匹配到阿拉伯数字,再尝试匹配中文数字
match = re.search(r"第([零一二三四五六七八九十百千万]+)章", filename)
if match:
chinese_num = match.group(1)
arabic_num = chinese_to_arabic(chinese_num)
return arabic_num if arabic_num != -1 else float('inf') # 找不到时放在最后
return float('inf') # 如果都没有匹配到,返回无穷大,放在最后
def merge_word_documents(folder_path, output_path):
# 创建一个新的Word文档
merged_document = Document()
# 获取文件夹中的所有文件,并按章节顺序排序
files = sorted([f for f in os.listdir(folder_path) if f.endswith(".docx")], key=natural_sort_key)
# 遍历排序后的文件列表
for filename in files:
print(f"正在合并文件: {filename}")
file_path = os.path.join(folder_path, filename)
# 打开当前的Word文档
current_document = Document(file_path)
# 将当前文档的内容复制到合并文档中
for element in current_document.element.body:
merged_document.element.body.append(element)
# 保存合并后的文档
merged_document.save(output_path)
# 程序入口
if __name__ == "__main__":
folder_path = "/Users/xxxx/Downloads/某笔记" # 替换为你的文件夹路径
output_path = "xx.docx"
merge_word_documents(folder_path, output_path)