readlines() 是什么?
readlines() 是 Python 文件对象的一个方法,用于从文件中读取所有行,并将它们作为一个列表返回。

列表中的每一个元素都是文件中的一行,包括行尾的换行符 \n。
基本语法
file_object.readlines()
file_object: 通过open()函数打开文件后返回的文件对象。- 该方法不需要任何参数。
使用示例
让我们通过一个示例文件 my_file.txt 来演示。
my_file.txt 的内容:
Hello, world!
This is the second line.
And this is the third line.
示例代码
# 1. 打开文件
# 使用 'with' 语句是推荐的做法,它会自动处理文件的关闭
try:
with open('my_file.txt', 'r', encoding='utf-8') as f:
# 2. 调用 readlines() 读取所有行
lines = f.readlines()
# 3. 打印结果
print("文件内容列表:")
print(lines)
# 4. 遍历列表,打印每一行
print("\n逐行打印内容:")
for line in lines:
# 注意:这里 line 包含了末尾的 \n
print(f"行内容: {line}", end='') # 使用 end='' 避免打印出额外的空行
except FileNotFoundError:
print("错误:文件未找到!")
except Exception as e:
print(f"发生了一个错误: {e}")
输出结果
['Hello, world!\n', 'This is the second line.\n', 'And this is the third line.\n']
Hello, world! This is the second line. And this is the third line.
关键点分析:

- 返回值:
['Hello, world!\n', 'This is the second line.\n', 'And this is the third line.\n']是一个列表。 - 换行符
\n: 每一行的末尾都保留了原始的换行符,这是readlines()的一个重要特性。 - 内存占用: 因为它一次性将整个文件读入内存,如果文件非常大(比如几个 GB),这可能会导致内存不足错误。
readlines() 的主要特点
- 返回列表: 将所有行存入一个列表,方便后续通过索引访问(如
lines[0])。 - 保留换行符: 列表中的每个字符串元素都包含行尾的
\n。 - 全量读取: 一次性读取整个文件,直到文件末尾,再次调用
readlines()会返回一个空列表,因为文件指针已经到了末尾。
readlines() 的一个常见陷阱:strip() 的使用
由于 readlines() 保留了 \n,如果你想在处理时去掉它,通常会用到 str.strip() 或 str.rstrip() 方法。
line.strip(): 去除字符串开头和结尾的所有空白字符(包括\n,\t, 空格等)。line.rstrip(): 去除字符串的所有空白字符(只针对\n更安全)。
示例:处理换行符
with open('my_file.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print("原始行(带\\n):")
for line in lines:
print(repr(line)) # repr() 可以更清楚地看到字符串的细节
print("\n处理后的行(使用 strip()):")
for line in lines:
# 去除每行首尾的空白字符
cleaned_line = line.strip()
print(repr(cleaned_line))
输出
原始行(带\n):
'Hello, world!\n'
'This is the second line.\n'
'And this is the third line.\n'
处理后的行(使用 strip()):
'Hello, world!'
'This is the second line.'
'And this is the third line.'
替代方案:for line in file_object
在大多数情况下,当你的目的是逐行处理文件内容时,使用 for 循环直接遍历文件对象是更推荐、更高效的方法。
为什么它更好?
- 内存效率高: 它是惰性读取的,每次只从文件中读取一行到内存,处理完后立即丢弃,再读取下一行,这对于处理非常大的文件至关重要,因为它不会一次性占用大量内存。
- 代码更简洁、更 Pythonic (Pythonic): 代码意图更清晰,直接表达了“对文件中的每一行执行操作”。
示例对比
假设 my_file.txt 是一个巨大的日志文件。
readlines() (不推荐处理大文件)

# 内存消耗大,文件大时可能导致程序崩溃
with open('huge_log_file.log', 'r') as f:
lines = f.readlines() # 一次性加载所有行到内存
for line in lines:
process(line) # 处理每一行
for line in file_object (推荐)
# 内存消耗极小,无论文件多大都只占用一行大小的内存
with open('huge_log_file.log', 'r') as f:
for line in f: # 直接遍历文件对象
process(line) # 处理每一行
注意: 当你使用 for line in f 时,line 同样会包含行尾的 \n,所以你可能仍然需要 line.strip() 或 line.rstrip() 来清理它。
总结与最佳实践
| 特性 | readlines() |
for line in file_object |
|---|---|---|
| 内存使用 | 高 (一次性加载整个文件) | 低 (逐行加载,惰性求值) |
| 适用场景 | 需要随机访问行 (如 lines[5])。文件很小,内存占用可以忽略。 需要将所有行一次性处理。 |
逐行处理(绝大多数情况)。 处理大文件或未知大小的文件。 简洁的代码风格。 |
| 返回值 | 一个包含所有行的列表。 | 一个迭代器,每次产生一行。 |
| 代码风格 | 传统,但有时略显繁琐。 | Pythonic, 推荐首选。 |
- 如果你只是想遍历文件的每一行并处理它,请使用
for line in file_object。 这是最高效、最安全、最符合 Python 风格的做法。 - 如果你确实需要将所有行存储在一个列表中以便后续多次访问或索引,并且文件不大,那么可以使用
readlines(),使用后记得用strip()或rstrip()去掉换行符。
