Python3.6优化文本提取:循环读取时记录行索引以减耗时
优化Python文本提取:单次遍历文件,从上次位置继续读取
我太懂这种反复读大文件的痛苦了——每次迭代都从头读一遍,数据量大的时候简直是时间黑洞!既然你的文件结构是按顺序出现多组FIRST xxx和SECOND xxx,而且不会回溯,那我们完全可以通过单次打开文件+保留读取位置的方式来彻底解决这个问题,让整个文件只被遍历一次,每次迭代直接从上次结束的地方继续找目标。
核心思路
- 只打开一次文件:保持文件句柄打开状态,Python的文件对象是自带读取状态的,迭代到哪一行,下次就从哪一行继续。
- 逐组匹配+及时停止:对每一组
strings1[i]和strings2[i],先找到起始标记,然后收集行直到找到对应的结束标记,找到后立刻停止当前段的读取,不用继续往后扫。
优化后的代码示例
# 你的起始和结束字符串列表 strings1 = ["FIRST A", "FIRST B", "FIRST C"] strings2 = ["SECOND A", "SECOND B", "SECOND C"] # 关键:只打开一次文件,全程保持句柄 with open("your_target_file.txt", "r", encoding="utf-8") as f: # 遍历每一组起始-结束对 for start_flag, end_flag in zip(strings1, strings2): current_group_data = [] is_capturing = False # 从上次迭代停下的位置开始逐行读 for line in f: stripped_line = line.strip() # 找到起始标记,开启捕获模式 if stripped_line == start_flag: is_capturing = True # 如果需要把起始行也加入数据,就注释掉下面的continue continue # 找到结束标记,关闭捕获并跳出当前行循环 if stripped_line == end_flag: is_capturing = False break # 处于捕获状态时,收集当前行 if is_capturing: current_group_data.append(stripped_line) # 这里处理当前组提取到的数据 print(f"提取到 {start_flag} 到 {end_flag} 的数据:") print(current_group_data) # 替换成你的业务逻辑:比如写入文件、分析数据等
为什么这比原来高效?
- 避免重复读取:整个文件只被遍历一次,而不是迭代多少次就读多少次,对于大文件来说,时间成本直接砍到原来的1/N(N是组数)。
- 及时终止读取:每找到一组的结束标记就立刻停止当前段的扫描,不会多余读取后面的内容。
- 低内存占用:逐行读取,不需要把整个文件加载到内存,就算是几GB的大文件也能轻松处理。
可选调整
- 如果需要包含起始行或者结束行,只需要调整代码中的
continue和break位置:- 要包含起始行:删除
if stripped_line == start_flag块里的continue,并加入current_group_data.append(stripped_line)。 - 要包含结束行:在
if stripped_line == end_flag块里先加入current_group_data.append(stripped_line),再执行break。
- 要包含起始行:删除
内容的提问来源于stack exchange,提问作者pythbytes
相关产品推荐
相关产品推荐

