Python使用for line in file遍历文件时如何读取匹配行之后的第n行
原有代码问题说明
你写的line(count + 3)、file[count + 3]写法不成立的原因有两个:
line是当前遍历到的单行字符串,仅存储当前行的文本内容,无法通过偏移量获取其他行- 文件对象是流式迭代器,没有实现下标随机访问的能力,不能像列表一样用
[索引]的方式读取指定行的内容
解决方法
Python的文件对象本身是可迭代的迭代器,匹配到目标行之后,直接调用next()方法就能依次获取后续的行,不需要自己维护行号计数做偏移。针对你的需求,修改后的代码如下:
# 建议用with上下文管理器自动处理文件关闭,避免资源泄漏 with open("result.txt", "r") as file: loss_arr = [] for line in file: # 匹配目标流速行 if "50000000bps" in line: # 跳过ping request、ping reply两行,读取Loss行 next(file) next(file) loss_line = next(file).strip() current_loss = loss_line.split("=")[-1].strip() # 跳过中间空行,读取Loss from start行 next(file) start_loss_line = next(file).strip() start_loss = start_loss_line.split(":")[-1].strip() # 存入数组 loss_arr.append((current_loss, start_loss)) print(f"当前Loss: {current_loss}, 累计Loss: {start_loss}")
注意事项
- 迭代器遍历文件时指针只会向后移动,不会重复读取已经遍历过的行
- 如果担心后续行数不足触发
StopIteration异常,可以给next()设置默认值,比如next(file, ""),行数不足时会返回空字符串不会报错 - 如果需要多次随机读取任意行,可以先把所有行读入列表再按索引访问:
lines = file.readlines(),之后直接用lines[count+3]的方式读取即可,适合文件体积不大的场景
内容的提问来源于stack exchange,提问作者user161458
相关产品推荐
相关产品推荐

