readlines() 依赖换行符\n切分行,末尾无\n时最后一行不被单独分割;splitlines() 更可靠,能正确包含末行且可选保留换行符。

不是“丢失”,而是你没读到——最后一行没换行符时,readlines() 不把它当独立一行处理。
readlines() 对换行符的依赖是硬性规则
readlines() 的行为完全由换行符 \n 驱动:它把文件内容按 \n 切分,每遇到一个 \n 就生成一个列表元素。如果文件末尾没有 \n(比如手动保存、命令行 echo 未加 -n、或某些编辑器默认),最后一行就“粘”在上一行后面,不会被切出来。
常见现象:
- 文件内容是
line1\nline2\nline3(无结尾换行)→readlines()返回['line1\n', 'line2\n', 'line3']—— 看似有三行,但第三项没\n - 文件内容是
line1\nline2\nline3\n(有结尾换行)→ 返回['line1\n', 'line2\n', 'line3\n'] - 你用
for line in f:迭代时,最后一行仍会被读到;但用readlines()+len()判断行数,就可能少算
用 splitlines() 替代 readlines() 更可靠
splitlines() 不依赖结尾换行符,它按逻辑行切分,自动忽略行尾 \n、\r\n 或 \r,且保证最后一行一定被包含。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 要获取干净的行列表(无换行符):用
content.splitlines(),不是readlines() - 要保留原始换行符?那就必须接受
readlines()的行为,并手动检查最后一行是否含\n -
splitlines(keepends=True)可选保留换行符,但此时最后一行仍不带\n—— 这正是它“正确”的表现
大文件场景下,别靠 readlines() 找最后一行
用 readlines() 读大文件再取 [-1],本质是把整份文件加载进内存。更糟的是,如果最后一行真没 \n,你还得额外判断它是否被截断或合并。
推荐做法:
- 小文件:直接
open(f).read().splitlines()[-1] - 大文件:用二进制
seek()向后扫描找最后一个\n,再readline()—— 但注意 Windows 换行符是\r\n,单字节扫描会错位 - 别用
linecache.getlines()处理大文件,它内部仍会全量读取并缓存
真正容易被忽略的点:你以为的“最后一行”可能根本没被 readlines() 当作一行,而你又没检查返回列表的实际长度和末项内容 —— 它不是 bug,是文档写明的行为,只是没人告诉你它这么苛刻。


















