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

Python如何按指定字符串或行号将文本文件拆分为多个文件

问题根因

readlines()返回空列表是因为第一次用for line in file1遍历完文件后,文件指针已经停在文件末尾,此时调用readlines()会从末尾位置开始读取内容,自然拿不到数据。
原有代码另外两个错误点:

  • 打开文件后未做关闭处理,存在文件资源泄漏风险
  • 拆分逻辑错误:仅将标记字符串所在的单行写入文件,没有覆盖两个标记点之间的完整分段内容,即使读到数据也无法得到正确拆分结果。

可直接运行的实现代码

方案1:逐行遍历边读边拆(推荐,适配超大文件)

不需要提前遍历采集行号,逐行读取时遇到目标字符串就切换写入文件,内存占用极低,不受文件大小限制:

target_str = 'Weight Total'
file_serial = 1
current_out = open(f'E{file_serial}.txt', 'w', encoding='utf-8')

with open('textfile_1.txt', 'r', encoding='utf-8') as source_f:
    for line in source_f:
        current_out.write(line)
        # 命中目标字符串则结束当前文件写入,切换到下一个新文件
        if target_str in line:
            current_out.close()
            file_serial += 1
            current_out = open(f'E{file_serial}.txt', 'w', encoding='utf-8')
# 写完最后一段后关闭文件句柄
current_out.close()

如果需要把标记行作为下一个分段的开头,把命中字符串后的切换文件逻辑移到write(line)代码前即可。

方案2:先采集标记行号再拆分

如果需要先获取所有标记行的行号再执行拆分,第一次遍历采集完成后可以重置文件指针回到文件开头,或者重新打开文件读取全部内容,同时修正分段切片逻辑:

target_str = 'Weight Total'
split_line_index = []

# 第一次遍历收集所有标记行的行号(行号从1开始计数)
with open('textfile_1.txt', 'r', encoding='utf-8') as source_f:
    for line_num, line in enumerate(source_f, start=1):
        if target_str in line:
            split_line_index.append(line_num)

# 读取文件全部内容,这里重新打开文件避免指针在末尾读不到数据
with open('textfile_1.txt', 'r', encoding='utf-8') as source_f:
    all_lines = source_f.readlines()

# 补充分段的首尾边界
split_boundary = [0] + split_line_index + [len(all_lines)]
file_serial = 1
for i in range(len(split_boundary) - 1):
    seg_start = split_boundary[i]
    seg_end = split_boundary[i+1]
    with open(f'E{file_serial}.txt', 'w', encoding='utf-8') as out_f:
        # 列表索引从0开始,和行号差1,切片时自动对齐
        out_f.writelines(all_lines[seg_start:seg_end])
    file_serial += 1

内容的提问来源于stack exchange,提问作者nirav.sos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:30:44