itertools.islice适合跳过文件前N行,因其惰性求值、不加载全文到内存、语义清晰且C实现性能优;须直接传文件对象,避免readlines();超大文件建议设置buffering。
itertools.islice 适合跳过文件前 N 行因为 itertools.islice 是惰

next() N 次或用 for i, line in enumerate(f) 再判断索引,islice 更简洁、语义更清晰,且底层用 C 实现,性能略优。
readlines()
常见错误是先调用 f.readlines(),这会一次性加载全部行到内存,完全失去流式处理意义。必须直接传入打开的文件对象(即迭代器),让 islice 在其上做切片:
from itertools import islicewith open("data.txt") as f:
跳过前 10 行,从第 11 行开始读
for line in islice(f, 10, None): process(line)
islice(f, 10, None) 表示从第 10 个元素(0 起始)开始,取到末尾islice(f, 0, 10) 才是取前 10 行 —— 注意起始/结束参数顺序和切片习惯一致islice 迭代完,文件指针已前进,后续再读就是从跳过后的那行开始islice 只按“迭代次数”跳过,不识别内容。如果文件里有空行、注释行或格式异常,它照常计数 —— 这不是 bug,是预期行为。若需“跳过前 N 行非空行”,得自己写过滤逻辑:
from itertools import islicedef nonempty_lines(f): return (line for line in f if line.strip())
with open("config.txt") as f: for line in islice(nonempty_lines(f), 5, None): # 跳过前 5 个非空行 print(line.rstrip())
UnicodeDecodeError)仍由原文件对象抛出,islice 不拦截也不处理open(..., encoding="gbk"),否则 islice 会继承错误解码后的乱码或异常buffering=8192 控制缓冲区大小,避免默认缓冲导致 IO 延迟islice
如果只是偶尔跳过几行,且后续要随机访问(比如反复读第 100 行、第 200 行),islice 就不合适 —— 它不可倒退、不可重用。此时更适合用 linecache.getline() 或先用 enumerate 缓存行号映射。
linecache 适合“按需查某几行”,但首次访问会缓存整文件,内存开销不可控enumerate + if i >= N: 更直观,性能差异微乎其微,可读性更好,尤其当逻辑不止跳过还要计数时islice(f, N, N+1) 取单行比 next(islice(f, N, None), None) 更安全,后者在 N 超出范围时返回 None,容易掩盖越界问题真正要注意的是:跳过行为本身不消耗额外内存,但后续处理每行的方式(比如 line.split() 出来的大列表、正则全匹配)才可能成为瓶颈 —— islice 只是门把手,别把它当成整栋楼。