杰瑞科技汇

Python中readlines()如何使用?

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

Python中readlines()如何使用?-图1
(图片来源网络,侵删)

核心概念

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

列表中的每一个元素,都是文件中的一行,并且默认会包含行尾的换行符 \n


语法

file_object.readlines()
  • file_object: 通过 open() 函数打开文件后返回的文件对象。
  • 该方法不接受任何参数(在 Python 3 中)。

工作原理

  1. 打开文件: 你需要使用 open() 函数以可读模式(通常是 'r')打开一个文件。
  2. 读取所有行: readlines() 会从当前文件指针的位置开始,一直读取到文件末尾。
  3. 返回列表: 它会将读取到的每一行(包括末尾的 \n)作为一个独立的字符串元素,存入一个列表中。
  4. 关闭文件: 操作完成后,应该使用 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 冲突

输出结果:

Python中readlines()如何使用?-图2
(图片来源网络,侵删)
['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() 返回的行字符串中包含了换行符,如果你不想要它,需要手动去除。

Python中readlines()如何使用?-图3
(图片来源网络,侵删)

去除换行符的方法:

方法 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() 来完成。
分享:
扫描分享到社交APP
上一篇
下一篇