如何用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
相关产品推荐
相关产品推荐

