You need to enable JavaScript to run this app. 如何基于正则或空行特征将大文本按记录拆分为多个独立小文件
优惠活动
大模型
产品
解决方案
定价
更多

如何基于正则或空行特征将大文本按记录拆分为多个独立小文件

问题原因分析

第一个版本代码错误点

  • 每次匹配到非分隔行时,都会以w覆盖模式重新打开对应序号的文件,新内容会覆盖旧内容,最终每个文件仅会保留最后一行写入的内容,同时因为没有主动关闭文件,缓冲区未刷新也可能导致内容完全为空。
  • 遇到分隔符仅做序号自增,未关闭前一个文件句柄,存在资源泄漏。

第二个版本代码错误点

  • 遇到分隔符序号自增后,没有创建新序号对应的输出文件句柄,后续非分隔行仍会写入前一个序号的文件中。
  • 正则匹配逻辑有缺陷:\s会匹配换行、制表符等所有空白字符,而非仅匹配空格,容易出现误匹配;同时未做全字符串匹配校验,可能出现匹配不准确的情况。
修复方案

正则版本修复

import re
# 正则精确匹配整行刚好为81个空格加换行
delimiter_pattern = re.compile(r"^ {81}\n$")
i = 1
output_file = None
try:
    with open("Junctions.txt", "r", encoding="utf-8") as input_f:
        output_file = open(f"{i}.txt", "w", encoding="utf-8")
        for line in input_f:
            if delimiter_pattern.match(line):
                # 遇到分隔符切换文件
                output_file.close()
                i += 1
                output_file = open(f"{i}.txt", "w", encoding="utf-8")
            else:
                output_file.write(line)
finally:
    # 确保最后一个文件正常关闭
    if output_file and not output_file.closed:
        output_file.close()

更简单的无正则版本

你不需要用正则,直接判断行去除首尾空白后是否为空即可识别分隔行:

i = 1
output_file = None
try:
    with open("Junctions.txt", "r", encoding="utf-8") as input_f:
        output_file = open(f"{i}.txt", "w", encoding="utf-8")
        for line in input_f:
            if not line.strip():
                # 空行就是分隔符,切换输出文件
                output_file.close()
                i += 1
                output_file = open(f"{i}.txt", "w", encoding="utf-8")
            else:
                output_file.write(line)
finally:
    if output_file and not output_file.closed:
        output_file.close()

补充说明

如果最终生成了多余的空白文件,是因为源文件末尾存在连续的分隔空行,你可以在切换文件前判断当前写入的文件内容是否为空,或者运行完成后批量删除大小为0的文件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 16:57:04