最稳妥的方式是用 itertools.islice,因为 readlines()[n:] 会将整个文件加载进内存,大文件时易引发 MemoryError、程序卡死或系统频繁 swap。
直接跳过前N行最稳妥的方式是用,而不是——后者会把整个文件一次性加载进内存,大文件时容易爆内存。
为什么
在大文件里很危险
调用
会把所有行读入内存生成一个大列表。哪怕你只想要第10001行开始的内容,Python 也得先把前面1万行全塞进 RAM。遇到几百 MB 的日志或 CSV,很容易触发
或拖慢整机响应。
常见错误现象:
、程序卡死、系统开始疯狂 swap。
适合小文件(
如果文件编码不统一(比如含 BOM 或混合 \r\n/\n),
还可能因解码失败中断
切片
本身不报错,但掩盖了底层一次性加载的问题
用
真正实现“跳过”而非“丢弃”
是迭代器友好的跳过方式:它不会预读全部内容,而是让文件对象逐行推进,跳过前 N 行后才开始真正消费数据。内存占用恒定,和文件大小无关。
立即学习
“
Python免费学习笔记(深入)
”;
实操建议:
必须配合
使用,确保文件句柄及时释放
跳过行数用
,注意第二个参数是起始索引,第三个是结束(
表示到末尾)
如果说明行不固定(比如以
或
开头),就别硬写数字,改用循环 +
或
示例:跳过前3行读取剩余内容
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
当说明行格式不固定时:用循环 +
更灵活
比如说明块可能有空行、注释行、版本信息行,长度不一。这时候硬写
容易错漏。
推荐做法是手动推进文件指针,直到遇到第一个“有效数据行”(比如非空、不含
、能被
正常解析等):
用
逐行跳过,配合
防止越界
判断条件写清楚,例如
一旦找到首行数据,就把当前
传给后续处理(如
),避免重复读取
示例:跳过所有以
或空行开头的说明行
真正难的不是“怎么跳过”,而是“怎么定义什么是该跳过的行”——业务逻辑决定跳过策略,工具只是执行者。别在没理清说明行边界规则前,就急着套
或切片。
itertools.islicereadlines()[n:]readlines()[n:]readlines()MemoryErrorMemoryErrorreadlines()readlines()[n:]itertools.isliceislicewith open(...)islice(f, n, None)None#//next()itertools.takewhilefrom itertools import islice
with open("data.txt", encoding="utf-8") as f:
for line in islice(f, 3, None):
print(line.rstrip())
next()islice(f, 5, None)#csv.readernext(f)try/except StopIterationline.strip() and not line.startswith("#")fcsv.reader(f)#with open("config.txt", encoding="utf-8") as f:
# 跳过说明块
for line in f:
if line.strip() and not line.strip().startswith("#"):
# 当前行是首条有效数据,保留它
first_data_line = line
break
else:
raise ValueError("no data line found")
# 继续读取剩余行(包括刚读到的 first_data_line)
lines = [first_data_line] + list(f)
islice