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

如何用Python正则分割大体积TXT小说文件?含问题排查与工具咨询

问题分析与解决方案

1. 脚本无输出的原因

  • readlines()会一次性将整个文件加载到内存,20MB以上的文本文件会占用大量内存,导致脚本运行缓慢甚至假死,无法及时输出结果。
  • re.findall()如果针对整个文件内容做全局匹配,同样需要一次性读取全部数据,大文件下正则引擎的处理效率极低,容易出现长时间无响应的情况。

2. 优化后的Python处理方案

改用逐行读取的方式处理,避免一次性加载整个文件,同时结合正则表达式识别章节标记,实现精准分割:

核心思路

  • 逐行遍历文件,实时跟踪当前所属的Book和Chapter
  • 遇到Book标记时,创建对应文件夹(如Book1)
  • 遇到Chapter标记时,切换当前输出文件(如B1C20.txt)
  • 收集正文内容写入对应文件,自动跳过开头的空行/空格行

示例代码

import os
import re

# 正则匹配规则
book_pattern = re.compile(r'^Book (I|II|III|IV|V|\d+):(.+)')
chapter_pattern = re.compile(r'^Chapter (\d+):(.+)')

def split_novel(file_path):
    current_book = None
    current_chapter = None
    output_file = None
    # 创建根目录
    root_dir = os.path.splitext(os.path.basename(file_path))[0]
    os.makedirs(root_dir, exist_ok=True)

    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            stripped_line = line.strip()
            # 跳过空行/空格行
            if not stripped_line:
                continue
            
            # 匹配Book标记
            book_match = book_pattern.match(stripped_line)
            if book_match:
                # 关闭之前的章节文件
                if output_file:
                    output_file.close()
                # 转换Book编号为数字(比如I→1)
                book_num = book_match.group(1)
                if book_num in ['I','II','III','IV','V']:
                    book_num = {'I':1, 'II':2, 'III':3, 'IV':4, 'V':5}[book_num]
                current_book = int(book_num)
                # 创建Book文件夹
                book_dir = os.path.join(root_dir, f'Book{current_book}')
                os.makedirs(book_dir, exist_ok=True)
                continue
            
            # 匹配Chapter标记
            chapter_match = chapter_pattern.match(stripped_line)
            if chapter_match and current_book:
                # 关闭之前的章节文件
                if output_file:
                    output_file.close()
                current_chapter = int(chapter_match.group(1))
                # 定义输出文件名
                output_filename = f'B{current_book}C{current_chapter}.txt'
                output_path = os.path.join(root_dir, f'Book{current_book}', output_filename)
                output_file = open(output_path, 'w', encoding='utf-8')
                # 写入章节标题
                output_file.write(stripped_line + '\n\n')
                continue
            
            # 写入正文(处理行首的制表符/两个空格)
            if output_file:
                # 移除行首的制表符或两个空格
                cleaned_line = line.lstrip('\t ')
                output_file.write(cleaned_line)
    
    # 关闭最后一个文件
    if output_file:
        output_file.close()

# 使用示例
split_novel('your_novel.txt')

合并章节的扩展

如果需要将多个章节合并为一个文件(如B3C20-50.txt),可以在代码中添加章节范围判断逻辑:

  • 定义需要合并的章节区间(如[(3,20,50)]表示Book3的20-50章)
  • 当遍历到对应章节时,将内容写入同一个合并文件

3. 关于在线工具的说明

大多数在线文本分割工具都有文件大小限制(通常在10MB以内),20MB以上的文件很难通过在线工具处理,而且存在数据隐私风险。建议优先使用本地脚本处理,既高效又安全。

内容的提问来源于stack exchange,提问作者XiaoPan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:07:38