如何基于正则或空行特征将大文本按记录拆分为多个独立小文件
问题原因分析
第一个版本代码错误点
- 每次匹配到非分隔行时,都会以
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
相关产品推荐
相关产品推荐

