不用手动关文件,但不关易致ResourceWarning或Windows下删/重命名失败;推荐with open()自动管理;readline()读首行含换行符,readline(1)仅读1字节;utf-8-sig可自动处理BOM;readline()内存占用仅为首行长度,远优于read().splitlines()[0]。

用 readline() 读首行必须手动关文件吗?
不用——但不关就容易出问题。Python 的 readline() 本身不负责资源管理,它只是从已打开的文件对象里取一行。文件是否关闭,取决于你怎么打开它的。
常见错误现象:ResourceWarning: unclosed file,或者后续脚本在 Windows 上删/重命名文件失败。
- 如果用
open()手动打开,没调close(),文件句柄一直占着 - 用
with open(...) as f:就安全,退出缩进自动关,推荐无脑用 -
readline()调用后文件指针停在第二行开头,不影响后续读取,但别误以为“只读了一行,文件就该自动关”
readline() 和 readline(1) 完全不是一回事
readline()(无参数)读到第一个换行符为止,返回带 \n 的字符串;加数字参数是「最多读那么多个字节」,不是「读第几行」。
使用场景:你想严格只拿第一行内容,比如解析 CSV 头、读配置文件注释行、跳过 BOM。
-
f.readline()→ 正确读首行(含换行符) -
f.readline(1)→ 只读 1 字节,大概率只拿到#或b',不是你想要的 - 如果首行超长(比如日志里嵌了 base64),
readline(n)可能截断,且不保证换行对齐
首行含 BOM 怎么办?readline() 会吃掉它吗?
会,但取决于你打开时有没有指定编码。BOM 是字节序列(如 b'\xef\xbb\xbf'),不是字符;Python 在解码时自动剥离,前提是用了 utf-8-sig 或显式处理。
错误现象:用 open('f.txt').readline() 读出来首行开头是 # coding,说明 BOM 没被识别,当普通字符留着了。
- 正确写法:
with open('f.txt', encoding='utf-8-sig') as f: first = f.readline() -
utf-8-sig会在读取时自动跳过 BOM,且不影响后续行解码 - 别用
rb模式配readline()再自己 decode —— BOM 判断逻辑得手写,容易漏
性能上,readline() 比 read().splitlines()[0] 快多少?
快非常多,尤其文件大时。read() 会把整个文件加载进内存,而 readline() 只读到第一个换行符就停。
使用场景:处理 GB 级日志、导出数据,或不确定文件大小的脚本(比如用户上传的任意文本)。
-
f.readline():内存占用 ≈ 首行长度,O(1) 时间 -
f.read().splitlines()[0]:内存占用 ≈ 整个文件,O(n) 时间,还多一次字符串分割 - 如果文件只有几 KB,差别可忽略;但一旦超 10MB,后者可能直接 OOM
文件句柄泄漏和 BOM 处理是两个最常被跳过的点,尤其在写一次性脚本时——人总想着“就开一次,关不关有啥关系”,但 Python 进程结束前它真不放。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











