readline() 是 Python 文件对象的一个核心方法,用于从文件中逐行读取内容,这在处理大文件或需要逐行处理数据的场景下非常有用,因为它不会一次性将整个文件加载到内存中,从而节省了内存资源。

readline() 的基本用法
语法
file_object.readline(size=-1)
-
参数
size(可选):- 如果提供了
size参数,readline()会尝试读取并返回至多size个字节(在文本模式下)或字符(在二进制模式下)。 - 如果省略
size或为负数(默认值),它会读取直到行尾,包括换行符\n。 - 如果到达文件末尾,它会返回一个空字符串 。
- 如果提供了
-
返回值:
- 返回读取到的一行字符串(包括末尾的换行符
\n)。 - 如果已经到达文件末尾,则返回空字符串 。
- 返回读取到的一行字符串(包括末尾的换行符
工作原理
每次调用 readline(),文件对象的“读取位置”会自动移动到下一行的开头,连续调用它,就能依次读取文件的每一行。
完整示例
假设我们有一个名为 my_file.txt 的文件,内容如下:

这是第一行。 这是第二行。 这是第三行。
示例 1:基本的逐行读取
这是最常见和推荐的用法。
# 1. 打开文件 (使用 'with' 语句可以确保文件被自动关闭)
try:
with open('my_file.txt', 'r', encoding='utf-8') as f:
# 循环读取,直到 readline() 返回空字符串
while True:
line = f.readline()
# line 是空字符串,说明已经到达文件末尾
if not line:
break
# 打印读取到的行 (注意末尾的换行符 \n)
print(f"读取到: {line!r}")
except FileNotFoundError:
print("错误:文件未找到!")
输出:
读取到: '这是第一行,\n'
读取到: '这是第二行,\n'
读取到: '这是第三行,\n'
可以看到,readline() 将每行连同其后的换行符 \n 一起读取了。
readline() vs. readlines() vs. 直接 for 循环
初学者常常会混淆这几种读取文件的方式,理解它们的区别非常重要。

| 方法 | 工作方式 | 内存占用 | 适用场景 |
|---|---|---|---|
f.readline() |
逐行读取,每次调用读取一行,手动控制流程。 | 低,一次只加载一行到内存。 | 需要精细控制读取逻辑,或处理超大文件时。 |
f.readlines() |
一次性读取所有行,将整个文件的所有行读入一个列表。 | 高,如果文件很大,会占用大量内存。 | 文件较小,且需要将所有行同时处理或随机访问。 |
for line in f: |
逐行迭代,这是 Pythonic 的方式,在后台也是使用 readline() 实现的。 |
低,一次只加载一行到内存。 | 绝大多数情况下的首选,代码简洁,且内存效率高。 |
示例 2:比较 readline() 和 for 循环
for 循环方式 (推荐)
with open('my_file.txt', 'r', encoding='utf-8') as f:
for line in f:
# for 循环会自动处理换行符,通常我们不需要它
print(f"处理行: {line.strip()}") # .strip() 用于去除首尾空白字符(包括 \n)
输出:
处理行: 这是第一行。
处理行: 这是第二行。
处理行: 这是第三行。
这种方式代码更简洁,可读性更高,是 Python 中读取文本文件的标准做法。
示例 3:readlines() 的使用
with open('my_file.txt', 'r', encoding='utf-8') as f:
lines = f.readlines() # lines 是一个列表: ['这是第一行,\n', '这是第二行,\n', '这是第三行,\n']
print(f"文件共有 {len(lines)} 行。")
for i, line in enumerate(lines):
print(f"第 {i+1} 行: {line.strip()}")
输出:
文件共有 3 行。
第 1 行: 这是第一行。
第 2 行: 这是第二行。
第 3 行: 这是第三行。
高级用法:readline() 的 size 参数
size 参数允许你读取一行的一部分,这在处理某些特定格式的文件时可能有用。
with open('my_file.txt', 'r', encoding='utf-8') as f:
# 只读取第一行的前5个字符
partial_line = f.readline(5)
print(f"第一行的前5个字符: {partial_line!r}") # 输出: '这是第'
# readline() 会从上一次结束的位置继续,读取剩下的部分直到行尾
rest_of_line = f.readline()
print(f"第一行的剩余部分: {rest_of_line!r}") # 输出: '一行,\n'
处理大文件的最佳实践
当处理非常大的日志文件、数据文件等时,应避免使用 readlines(),因为它会耗尽内存,以下是两种推荐的方法:
使用 for 循环 (最推荐)
这是最简单、最 Pythonic 的方法。
# 假设有一个非常大的文件 huge_file.log
line_count = 0
with open('huge_file.log', 'r', encoding='utf-8') as f:
for line in f:
# 在这里处理每一行,
# if "ERROR" in line:
# print(f"发现错误: {line.strip()}")
line_count += 1
print(f"文件总行数为: {line_count}")
手动使用 readline() (更灵活)
如果你需要在循环中做更复杂的判断(跳过某些行),手动控制 readline() 会更有用。
line_count = 0
with open('huge_file.log', 'r', encoding='utf-8') as f:
while True:
line = f.readline()
if not line: # 文件结束
break
# 示例:跳过空行
if not line.strip():
continue
# 在这里处理非空行
# process(line)
line_count += 1
print(f"文件有效行数为: {line_count}")
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 常规文本文件读取 | for line in f: |
代码简洁、可读性高、内存效率高。 |
| 需要逐行精细控制 | while True: f.readline() |
灵活性最高,可以自定义循环条件和逻辑。 |
| 需要随机访问行 | lines = f.readlines() |
将所有行读入列表,可以通过索引 lines[i] 访问。 |
| 处理超大文件 | for line in f: 或 while 循环 |
内存占用低,不会导致程序崩溃。 |
| 读取二进制文件 | f.readline(size) 在二进制模式下 ('rb') 使用 |
可以精确控制读取的字节数。 |
readline() 是一个非常基础且强大的工具,在日常开发中,你更常会使用其语法糖 for line in f:,但在特定需要手动控制流程的场景下,直接使用 f.readline() 会是更好的选择。
