readline 这个词在 Python 中通常有两个层面的含义:

(图片来源网络,侵删)
- 标准库模块
readline: 这是一个功能强大的模块,它为 Python 提供了高级的行编辑和历史记录功能,类似于在 Unix/Linux 终端中使用的体验。 - 文件对象的
readline()方法: 这是文件对象的一个内置方法,用于从文件中读取一行内容。
这两个概念相关但用途不同,下面我们分别进行详细说明。
文件对象的 readline() 方法
这是最常见、最基础的用法,用于从文件中逐行读取数据。
基本语法
file_object.readline(size=-1)
file_object: 一个通过open()函数打开的文件对象。size(可选): 一个整数,如果提供,表示最多读取的字符数(或字节数),如果省略或为-1,则读取一整行,直到遇到换行符\n或文件末尾。
工作原理
每次调用 readline(),它会从文件当前位置开始,读取直到遇到下一个换行符 \n 的所有字符(包括换行符本身),然后返回这些内容作为一个字符串,如果到达文件末尾,则返回一个空字符串 。
示例代码
假设我们有一个名为 example.txt 的文件,内容如下:

(图片来源网络,侵删)
Hello, world!
This is the second line.
This is the third line.
示例 1:逐行读取整个文件
# 打开文件
with open('example.txt', 'r') as f:
# 第一次调用
line1 = f.readline()
print(f"第一行: {line1}") # 输出: 第一行: Hello, world!\n
# 第二次调用
line2 = f.readline()
print(f"第二行: {line2}") # 输出: 第二行: This is the second line.\n
# 第三次调用
line3 = f.readline()
print(f"第三行: {line3}") # 输出: 第三行: This is the third line.\n
# 第四次调用,文件已读完
line4 = f.readline()
print(f"第四行: '{line4}'") # 输出: 第四行: ''
示例 2:使用 size 参数
with open('example.txt', 'r') as f:
# 读取第一行的前 5 个字符
partial_line = f.readline(5)
print(f"部分读取: '{partial_line}'") # 输出: 部分读取: 'Hello'
# 再次调用,会从上次的结束位置继续,直到读完第一行
rest_of_line = f.readline()
print(f"剩余部分: '{rest_of_line}'") # 输出: 剩余部分: ', world!\n'
示例 3:在 while 循环中读取文件
这是读取文件最经典和推荐的方式,可以处理任意大小的文件而不会耗尽内存。

(图片来源网络,侵删)
with open('example.txt', 'r') as f:
line_count = 0
while True:
line = f.readline()
# 如果返回空字符串,说明已到达文件末尾
if not line:
break
line_count += 1
print(f"第 {line_count} 行: {line.strip()}") # 使用 strip() 去掉首尾的空白字符(包括\n)
# 输出:
# 第 1 行: Hello, world!
# 第 2 行: This is the second line.
# 第 3 行: This is the third line.
标准库模块 readline
这个模块主要用于增强交互式控制台(REPL)的用户体验,提供命令行编辑和历史记录功能。
主要功能
- 命令行编辑: 你可以使用方向键移动光标,
Ctrl+A跳到行首,Ctrl+E跳到行尾,Ctrl+K删除到行尾等。 - 历史记录: 使用上下方向键可以浏览之前输入过的命令。
- 自动补全: 可以通过按
Tab键来自动补全变量名或函数名(需要额外配置)。
注意事项
- 平台依赖:
readline模块主要在 Unix-like 系统(如 Linux, macOS)上可用,在 Windows 上,它默认不可用。 - 安装: 在 Windows 上,如果你需要这个功能,可以安装
pyreadline3库:pip install pyreadline3。 - 使用场景: 主要用于编写交互式的命令行工具或脚本,而不是普通的文件读写。
示例代码
这个模块的用法与 Bash shell 类似。
import readline
# 设置一个历史记录文件
histfile = ".python_history"
try:
readline.read_history_file(histfile)
except FileNotFoundError:
pass
# 读取用户输入
while True:
try:
# input() 函数在 Unix-like 系统上会自动使用 readline 模块的功能
user_input = input(">>> ")
if user_input.lower() == 'exit':
break
print(f"你输入了: {user_input}")
except EOFError:
# 当用户按下 Ctrl+D 时,会触发 EOFError
print("\n退出程序")
break
# 保存历史记录
readline.write_history_file(histfile)
当你运行这个脚本时,你会发现在输入时可以使用方向键和 Ctrl 组合键来编辑输入,并且上下键可以回溯历史输入,退出后,你的输入历史会保存在 .python_history 文件中。
读取所有行:readlines() 与列表推导式
除了 readline(),还有一个 readlines() 方法,它会一次性读取文件的所有行,并将它们作为一个列表返回。对于非常大的文件,这会消耗大量内存,应谨慎使用。
with open('example.txt', 'r') as f:
all_lines = f.readlines()
print(all_lines)
# 输出: ['Hello, world!\n', 'This is the second line.\n', 'This is the third line.\n']
推荐的内存高效替代方案(列表推导式 + for 循环)
# 方式一:直接迭代文件对象(最Pythonic)
with open('example.txt', 'r') as f:
lines = [line.strip() for line in f]
print(lines)
# 输出: ['Hello, world!', 'This is the second line.', 'This is the third line.']
# 方式二:使用列表推导式调用 readline
with open('example.txt', 'r') as f:
lines = [f.readline().strip() for _ in range(3)] # 假设你知道行数
print(lines)
# 输出: ['Hello, world!', 'This is the second line.', 'This is the third line.']
总结与对比
| 特性 | file.readline() (方法) |
readlines() (方法) |
import readline (模块) |
|---|---|---|---|
| 用途 | 从文件中逐行读取 | 从文件中一次性读取所有行 | 增强交互式终端的输入体验 |
| 返回值 | 单个字符串(一行内容) | 字符串列表(所有行) | 不直接返回,通过 input() 体现功能 |
| 内存消耗 | 低,每次只加载一行 | 高,加载所有行到内存 | 不涉及文件读取,不影响内存 |
| 平台 | 所有平台 | 所有平台 | 主要 Unix-like, Windows 需 pyreadline3 |
| 典型用法 | while True: line = f.readline() |
lines = f.readlines() |
import readline; input(...) |
核心要点:
- 要从文件中读取一行,使用
file.readline()。 - 要逐行处理一个文件,最好的方式是直接
for line in file_object:,或者使用while循环和readline()。 import readline是一个完全不同的东西,它让你的 Python 交互式 shell 更好用,与文件操作无关。
