文件夹下所有txt文件合并成一个txt文件

前言:

        之前看小说发现有些小说不能下载,只能在线看,然后想办法用爬虫将正本小说爬下来,但是爬下来的小说一个章节就成了一个文件,如下:

然后我就想把他们整合成一个文件,这样也好导入其他app进行阅读,所以就又开始捣鼓

代码:

注:上面代码做了一些简单的注释,应该都能看懂,注意目录就自己填自己的路径

import os
import re

def extract_chapter_number(filename):
    """
    从文件名中提取章节编号,并将大写数字转换为阿拉伯数字。
    
    参数:
    filename (str): 文件名。
    
    返回:
    int: 章节编号。
    """
    match = re.search(r'第([^章]+)章', filename, re.IGNORECASE)
    if match:
        chapter_str = match.group(1).strip()
        return chinese_to_arabic(chapter_str)
    return float('inf')  # 如果没有找到章节号,默认为无穷大,保证排序在最后

def chinese_to_arabic(chinese_num):
    """
    将中文大写数字转换为阿拉伯数字。
    
    参数:
    chinese_num (str): 中文大写数字字符串。
    
    返回:
    int: 阿拉伯数字。
    """
    num_map = {
        '零': 0, '一': 1, '二': 2, '三': 3, '四': 4,
        '五': 5, '六': 6, '七': 7, '八': 8, '九': 9,
        '十': 10, '百': 100, '千': 1000, '万': 10000
    }
    
    unit_map = {'十': 10, '百': 100, '千': 1000, '万': 10000}
    
    arabic_num = 0
    unit = 1
    prev_unit = 0
    
    for char in reversed(chinese_num):
        if char in num_map:
            num = num_map[char]
            if num >= 10 and unit <= num:
                unit = num
            else:
                arabic_num += num * unit
            prev_unit = unit
        elif char in unit_map:
            unit = unit_map[char]
            if unit > prev_unit:
                arabic_num -= prev_unit
                arabic_num += unit
            else:
                arabic_num += unit
            prev_unit = unit
        else:
            raise ValueError(f"无法识别的字符: {char}")
    
    return arabic_num

def merge_txt_files(directory, output_file):
    """
    合并指定文件夹内的所有 .txt 文件到一个新的 .txt 文件中,并记录每个文件的名称。
    按照文件名中的章节编号排序合并。章节号改为大写并顶格显示,文章内容缩进两格。

    参数:
    directory (str): 包含 .txt 文件的文件夹路径。
    output_file (str): 新的 .txt 文件的路径。
    """
    # 检查目录是否存在
    if not os.path.isdir(directory):
        print(f"错误:指定的路径 '{directory}' 不是一个有效的目录。")
        return

    # 获取目录中所有 .txt 文件的列表,并按文件名中的章节编号排序
    txt_files = [f for f in os.listdir(directory) if f.endswith('.txt')]
    txt_files.sort(key=extract_chapter_number)

    # 打开输出文件,如果文件存在则清空内容
    with open(output_file, 'w', encoding='utf-8') as outfile:
        # 遍历排序后的文件列表
        for filename in txt_files:
            filepath = os.path.join(directory, filename)
            try:
                # 提取章节编号并转换为大写
                chapter_number = extract_chapter_number(filename)
                chapter_number_str = f"第{chapter_number}章".upper()

                # 读取文件内容并追加到输出文件
                with open(filepath, 'r', encoding='utf-8') as infile:
                    # 记录文件名(去除后缀)
                    base_name = os.path.splitext(filename)[0]
                    outfile.write(f"\n{base_name}\n")
                    content = infile.read()
                    # 缩进文章内容两格
                    indented_content = "\n".join("  " + line for line in content.splitlines())
                    outfile.write(indented_content)
                    outfile.write(f"\n--- 本章节完---\n\n")  # 分隔符,标识文件结束
            except Exception as e:
                print(f"处理文件 {filename} 时出错:{e}")

if __name__ == "__main__":
    # 指定包含 .txt 文件的文件夹路径
    directory = r"D:\Users\Desktop\个人文档\Python学习\下载内容\叶凌天"
    
    # 动态生成输出文件的名称,并加上书名号
    output_directory = os.path.dirname(directory)
    output_filename = f"《{os.path.basename(directory)}》.txt"
    output_file = os.path.join(output_directory, output_filename)
    
    merge_txt_files(directory, output_file)
    print(f"合并完成,所有 .txt 文件已合并到 {output_file}")



        各位大神轻点喷,以前没有接触过python,觉得python还挺有意思,所以没事自己捣鼓一下,算是一边学习一边记录,希望能和各位大神相互交流学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值