这是一个非常常用的文件操作方法,但同时也存在一些需要注意的地方。

核心概念
readlines() 是 Python 文件对象的一个方法,用于读取文件中的所有行,并将它们作为一个列表返回。
列表中的每一个元素,都是文件中的一行,并且默认会包含行尾的换行符 \n。
语法
file_object.readlines()
file_object: 通过open()函数打开文件后返回的文件对象。- 该方法不接受任何参数(在 Python 3 中)。
工作原理
- 打开文件: 你需要使用
open()函数以可读模式(通常是'r')打开一个文件。 - 读取所有行:
readlines()会从当前文件指针的位置开始,一直读取到文件末尾。 - 返回列表: 它会将读取到的每一行(包括末尾的
\n)作为一个独立的字符串元素,存入一个列表中。 - 关闭文件: 操作完成后,应该使用
file_object.close()关闭文件,以释放系统资源,更好的方式是使用with语句,它会自动处理文件的关闭。
示例
假设我们有一个名为 example.txt 的文件,其内容如下:
Hello, world!
This is the second line.
This is the third line.
示例 1: 基本用法
# 使用 with 语句打开文件,推荐做法
with open('example.txt', 'r', encoding='utf-8') as f:
# 读取所有行到列表中
lines = f.readlines()
# 打印返回的列表
print(lines)
# 输出: ['Hello, world!\n', 'This is the second line.\n', 'This is the third line.\n']
# 打印列表的类型
print(type(lines))
# 输出: <class 'list'>
# 遍历列表,打印每一行
print("\n--- 遍历输出 ---")
for line in lines:
print(line, end='') # 使用 end='' 来避免 print 函数自己添加的换行符与行尾的 \n 冲突
输出结果:

['Hello, world!\n', 'This is the second line.\n', 'This is the third line.\n']
--- 遍历输出 ---
Hello, world!
This is the second line.
This is the third line.
从输出中可以清楚地看到,readlines() 返回的列表中,每个字符串都保留了原始文件中的换行符 \n。
重要注意事项
内存消耗(最大的缺点)
readlines() 会一次性将整个文件加载到内存中,如果文件非常大(比如几个 GB),这会消耗掉大量的内存,甚至可能导致程序崩溃。
替代方案:逐行读取
对于大文件,推荐使用 for 循环直接迭代文件对象,这种方式是惰性求值的,每次只读取一行到内存中,非常节省内存。
# 高效处理大文件的方式
with open('example.txt', 'r', encoding='utf-8') as f:
for line in f: # 直接迭代文件对象
print(line, end='')
行尾的换行符 \n
如示例所示,readlines() 返回的行字符串中包含了换行符,如果你不想要它,需要手动去除。

去除换行符的方法:
方法 A:使用 strip()
strip() 会移除字符串首尾的空白字符(包括 \n, \t, 空格等)。
with open('example.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
clean_lines = [line.strip() for line in lines]
print(clean_lines)
# 输出: ['Hello, world!', 'This is the second line.', 'This is the third line.']
方法 B:使用 rstrip()
rstrip() 只移除字符串末尾的空白字符,如果你只想去掉 \n 而保留行首的空格(如果有的话),这个方法更精确。
with open('example.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
clean_lines = [line.rstrip('\n') for line in lines]
print(clean_lines)
# 输出: ['Hello, world!', 'This is the second line.', 'This is the third line.']
文件指针
readlines() 会读取从当前文件指针位置到文件末尾的所有内容,如果你在调用 readlines() 之前使用了其他读取方法(如 read() 或 readline()),文件指针已经移动了,readlines() 将从新的位置开始读取。
with open('example.txt', 'r', encoding='utf-8') as f:
# 先读取前 5 个字符
print(f"读取前5个字符: {f.read(5)}")
# 输出: 读取前5个字符: Hello
# 此时文件指针在 'o' 之后
# 再调用 readlines(),它会从指针位置开始读取剩余内容
remaining_lines = f.readlines()
print(f"\n剩余行: {remaining_lines}")
# 输出:
# 剩余行: [', world!\n', 'This is the second line.\n', 'This is the third line.\n']
readlines() vs. read() vs. readline()
为了更好地理解,这里做一个简单的对比:
| 方法 | 描述 | 返回值 | 内存消耗 | 适用场景 |
|---|---|---|---|---|
read() |
读取整个文件作为一个大字符串。 | str |
高 (一次性加载全部内容) | 读取小文件,或需要对整个文件内容进行一次性处理。 |
readlines() |
读取所有行,返回一个字符串列表。 | list |
高 (一次性加载全部内容) | 需要随机访问某一行(如 lines[5]),且文件不大。 |
readline() |
只读取一行。 | str |
低 (每次只加载一行) | 逐行处理,不确定文件总行数,或文件非常大。 |
for line in f: |
Pythonic 的逐行迭代方式。 | 每次迭代返回一行 (str) |
低 (惰性加载,内存效率最高) | 处理大文件的首选方式。 |
readlines()的作用:将文件所有行读入一个列表。- 优点:简单直接,方便后续通过索引访问特定行。
- 缺点:内存消耗巨大,不适合处理大文件。
- 最佳实践:
- 对于小文件,
readlines()是一个方便快捷的选择。 - 对于大文件,请务必使用
for line in file_object:的方式逐行读取,以避免内存问题。 - 记得处理行尾的换行符
\n,通常使用列表推导式结合strip()或rstrip()来完成。
- 对于小文件,
