杰瑞科技汇

python readline 文件

readline() 是 Python 文件对象的一个核心方法,用于从文件中逐行读取内容,这在处理大文件或需要逐行处理数据的场景下非常有用,因为它不会一次性将整个文件加载到内存中,从而节省了内存资源。

python readline 文件-图1
(图片来源网络,侵删)

readline() 的基本用法

语法

file_object.readline(size=-1)
  • 参数 size (可选):

    • 如果提供了 size 参数,readline() 会尝试读取并返回至多 size 个字节(在文本模式下)或字符(在二进制模式下)。
    • 如果省略 size 或为负数(默认值),它会读取直到行尾,包括换行符 \n
    • 如果到达文件末尾,它会返回一个空字符串 。
  • 返回值:

    • 返回读取到的一行字符串(包括末尾的换行符 \n)。
    • 如果已经到达文件末尾,则返回空字符串 。

工作原理

每次调用 readline(),文件对象的“读取位置”会自动移动到下一行的开头,连续调用它,就能依次读取文件的每一行。


完整示例

假设我们有一个名为 my_file.txt 的文件,内容如下:

python readline 文件-图2
(图片来源网络,侵删)
这是第一行。
这是第二行。
这是第三行。

示例 1:基本的逐行读取

这是最常见和推荐的用法。

# 1. 打开文件 (使用 'with' 语句可以确保文件被自动关闭)
try:
    with open('my_file.txt', 'r', encoding='utf-8') as f:
        # 循环读取,直到 readline() 返回空字符串
        while True:
            line = f.readline()
            # line 是空字符串,说明已经到达文件末尾
            if not line:
                break
            # 打印读取到的行 (注意末尾的换行符 \n)
            print(f"读取到: {line!r}")
except FileNotFoundError:
    print("错误:文件未找到!")

输出:

读取到: '这是第一行,\n'
读取到: '这是第二行,\n'
读取到: '这是第三行,\n'

可以看到,readline() 将每行连同其后的换行符 \n 一起读取了。


readline() vs. readlines() vs. 直接 for 循环

初学者常常会混淆这几种读取文件的方式,理解它们的区别非常重要。

python readline 文件-图3
(图片来源网络,侵删)
方法 工作方式 内存占用 适用场景
f.readline() 逐行读取,每次调用读取一行,手动控制流程。 ,一次只加载一行到内存。 需要精细控制读取逻辑,或处理超大文件时。
f.readlines() 一次性读取所有行,将整个文件的所有行读入一个列表。 ,如果文件很大,会占用大量内存。 文件较小,且需要将所有行同时处理或随机访问。
for line in f: 逐行迭代,这是 Pythonic 的方式,在后台也是使用 readline() 实现的。 ,一次只加载一行到内存。 绝大多数情况下的首选,代码简洁,且内存效率高。

示例 2:比较 readline()for 循环

for 循环方式 (推荐)

with open('my_file.txt', 'r', encoding='utf-8') as f:
    for line in f:
        # for 循环会自动处理换行符,通常我们不需要它
        print(f"处理行: {line.strip()}") # .strip() 用于去除首尾空白字符(包括 \n)

输出:

处理行: 这是第一行。
处理行: 这是第二行。
处理行: 这是第三行。

这种方式代码更简洁,可读性更高,是 Python 中读取文本文件的标准做法。

示例 3:readlines() 的使用

with open('my_file.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines() # lines 是一个列表: ['这是第一行,\n', '这是第二行,\n', '这是第三行,\n']
    print(f"文件共有 {len(lines)} 行。")
    for i, line in enumerate(lines):
        print(f"第 {i+1} 行: {line.strip()}")

输出:

文件共有 3 行。
第 1 行: 这是第一行。
第 2 行: 这是第二行。
第 3 行: 这是第三行。

高级用法:readline()size 参数

size 参数允许你读取一行的一部分,这在处理某些特定格式的文件时可能有用。

with open('my_file.txt', 'r', encoding='utf-8') as f:
    # 只读取第一行的前5个字符
    partial_line = f.readline(5)
    print(f"第一行的前5个字符: {partial_line!r}") # 输出: '这是第'
    # readline() 会从上一次结束的位置继续,读取剩下的部分直到行尾
    rest_of_line = f.readline()
    print(f"第一行的剩余部分: {rest_of_line!r}") # 输出: '一行,\n'

处理大文件的最佳实践

当处理非常大的日志文件、数据文件等时,应避免使用 readlines(),因为它会耗尽内存,以下是两种推荐的方法:

使用 for 循环 (最推荐)

这是最简单、最 Pythonic 的方法。

# 假设有一个非常大的文件 huge_file.log
line_count = 0
with open('huge_file.log', 'r', encoding='utf-8') as f:
    for line in f:
        # 在这里处理每一行,
        # if "ERROR" in line:
        #     print(f"发现错误: {line.strip()}")
        line_count += 1
print(f"文件总行数为: {line_count}")

手动使用 readline() (更灵活)

如果你需要在循环中做更复杂的判断(跳过某些行),手动控制 readline() 会更有用。

line_count = 0
with open('huge_file.log', 'r', encoding='utf-8') as f:
    while True:
        line = f.readline()
        if not line:  # 文件结束
            break
        # 示例:跳过空行
        if not line.strip():
            continue
        # 在这里处理非空行
        # process(line)
        line_count += 1
print(f"文件有效行数为: {line_count}")

场景 推荐方法 原因
常规文本文件读取 for line in f: 代码简洁、可读性高、内存效率高。
需要逐行精细控制 while True: f.readline() 灵活性最高,可以自定义循环条件和逻辑。
需要随机访问行 lines = f.readlines() 将所有行读入列表,可以通过索引 lines[i] 访问。
处理超大文件 for line in f:while 循环 内存占用低,不会导致程序崩溃。
读取二进制文件 f.readline(size) 在二进制模式下 ('rb') 使用 可以精确控制读取的字节数。

readline() 是一个非常基础且强大的工具,在日常开发中,你更常会使用其语法糖 for line in f:,但在特定需要手动控制流程的场景下,直接使用 f.readline() 会是更好的选择。

分享:
扫描分享到社交APP
上一篇
下一篇