readline() 是 Python 文件对象的一个方法,用于从文件中读取一行
方法签名
file.readline(size=-1)
核心参数:size
size 参数是 readline() 中唯一且最重要的参数,它控制着读取的最大字节数。
size 的取值及其行为:
-
size = -1 (默认值)
-
行为:读取直到遇到换行符 \n 或到达文件末尾。
-
说明:这是 readline() 最常见的用法,即完整地读取一整行,包括行尾的换行符 \n(如果文件中存在),如果到达文件末尾,则不会返回换行符。
-
示例:
# 假设文件 'my_file.txt' 内容如下:
# Hello World
# This is a test.
with open('my_file.txt', 'r') as f:
line1 = f.readline() # size 默认为 -1
line2 = f.readline(-1) # 显式传入 -1
print(f"第一次读取: {repr(line1)}") # repr() 会显示特殊字符
print(f"第二次读取: {repr(line2)}")
输出:
第一次读取: 'Hello World\n'
第二次读取: 'This is a test.\n'
注意 repr() 输出中的 \n。
-
size > 0 (正整数)
-
行为:读取最多 size 个字节,如果在读取 size 个字节之前遇到了换行符 \n,则会立即停止读取,即使读取的字节数还没达到 size。
-
说明:这个参数可以用来限制单次读取的数据量,对于处理非常大的单行文件或网络流非常有用,可以防止内存占用过高。
-
示例:
# 假设文件 'my_file.txt' 内容如下:
# Hello World
# This is a test.
with open('my_file.txt', 'r') as f:
# 读取最多 5 个字节
line1 = f.readline(5)
# 继续读取,直到遇到换行符
line2 = f.readline()
# 再读取一行
line3 = f.readline()
print(f"第一次读取(5字节): {repr(line1)}")
print(f"第二次读取: {repr(line2)}")
print(f"第三次读取: {repr(line3)}")
输出:
第一次读取(5字节): 'Hello'
第二次读取: ' World\n'
第三次读取: 'This is a test.\n'
第一次读取只取了 5 个字节 "Hello",然后停止,下一次调用 readline() 会从 " World" 开始,并读取到行尾。
-
size = 0
与 readlines() 的区别
初学者经常混淆 readline() 和 readlines(),这是一个非常重要的区别:
| 特性 |
file.readline() |
`file.readlines() |
| 功能 |
读取一行
| 读取所有行
| |
| 返回值 |
一个字符串(包含行尾的 \n)。 |
一个列表,列表中的每个元素都是文件的一行(也包含 \n)。 |
| 内存占用 |
低,逐行处理,内存占用恒定。 |
高,会将整个文件内容加载到内存中。 |
| 典型用法 |
while 循环,逐行处理大文件。 |
for 循环,处理小文件或需要随机访问某一行时。 |
readlines() 示例:
with open('my_file.txt', 'r') as f:
all_lines = f.readlines()
print(f"所有行: {all_lines}")
print(f"第一行: {all_lines[0]}")
输出:
所有行: ['Hello World\n', 'This is a test.\n']
第一行: Hello World
实际应用场景:逐行读取大文件
当处理非常大的文件(如日志文件、CSV 文件)时,使用 readlines() 会一次性将所有内容读入内存,可能导致程序崩溃,这时,readline() 的优势就体现出来了。
推荐写法 1:直接迭代文件对象 (最 Pythonic)
# 这是最高效、最简洁的方式
with open('very_large_file.log', 'r') as f:
for line in f:
# 在这里处理每一行,line 是一个字符串
print(line.strip()) # .strip() 用于移除首尾的空白字符(包括 \n)
原理:当你在 for 循环中迭代一个文件对象时,Python 在底层会自动调用 readline() 方法来获取下一行。
推荐写法 2:显式使用 while 循环和 readline()
with open('very_large_file.log', 'r') as f:
while True:
line = f.readline()
if not line: # readline() 返回空字符串,说明已到达文件末尾
break
# 在这里处理 line
print(line.strip())
这两种写法在内存效率上是等价的,但第一种更简洁。
| 参数值 |
行为 |
适用场景 |
size=-1 (默认) |
读取完整的一行(直到 \n 或文件末尾) |
绝大多数情况,标准的一行读取。 |
size > 0 |
读取最多 size 个字节,或在遇到 \n 时停止。 |
需要精确控制读取数据量,处理流式数据或超大单行文件。 |
size=0 |
返回空字符串 |
几乎不使用。 |
核心要点:
readline() 默认读取一整行,并保留行尾的换行符 \n。
- 使用
readline(size=N) 可以限制读取的字节数。
- 处理大文件时,应使用
for line in f: 或 while 循环配合 readline(),以避免内存问题。
readline() 返回字符串,readlines() 返回字符串列表。