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

