Python如何根据列表存储的起止行号打印文件对应行
实现方法
你已经拿到了每段坐标对应的起止行号,只需要先把文件所有行读入为索引和行号对应的列表,再配对遍历起止列表切片取内容打印即可,注意适配Python2.7的语法和列表索引规则:
- Python列表索引从0开始计数,如果你之前计算的
CStart/CEnd是按文本编辑器显示的1-based行号存储,取内容时需要把行号减1,否则会出现行错位 - Python列表切片是左闭右开区间,要取到结束行号对应的内容,切片结束位置需要设为
end_line + 1,否则会漏掉最后一行 readlines()读入的每行末尾自带换行符,打印时建议去掉末尾换行,避免出现多余空行
完整修改后的代码
def printCart(filename): # 一次性读入文件所有行,行索引和行号一一对应 with open(filename, 'r') as f: all_lines = f.readlines() CStart = [] CEnd = [] # 保留你原有的起止行号计算逻辑 for i in range(len(slist)): start = slist[i] + 5 end = start + int(num) - 1 CStart.append(start) CEnd.append(end) # 配对遍历每一组起止行号,逐段打印内容 for seg_num, (start, end) in enumerate(zip(CStart, CEnd)): print("=" * 15) print("第%d段坐标:" % (seg_num + 1)) # 如果你的行号是1-based,把下面切片改为 all_lines[start-1 : end] for line in all_lines[start : end + 1]: print(line.rstrip('\n')) return CStart, CEnd
补充说明
如果处理的文件体积特别大(几百MB以上),不适合一次性读入内存,可以换逐行遍历+标记位的写法:逐行读取时维护一个当前行号计数器,判断当前行号是否落在任意一段坐标的行区间内,落在区间内就打印,区间外就跳过。但针对存坐标段的常规小文件,上面的写法逻辑最简洁,排查问题也方便。
内容的提问来源于stack exchange,提问作者copperzinc
相关产品推荐
相关产品推荐

