Python 排序文件名并合并多个文件为docx

今天需要合并多个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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值