readlines()

readlines() 是 Python 中用于从文件对象中读取所有行的方法。它会一次性读取整个文件内容,并将每一行作为一个字符串存储在一个列表中返回。

使用方法和返回值

  • 使用 readlines() 方法可以读取文件的所有内容,每一行作为列表中的一个元素。
  • 如果文件很大,一次性读取可能会占用较多内存,因此在处理大文件时需要注意内存消耗。

示例说明

假设有一个文本文件 example.txt 包含以下内容:

Hello Python!
This is a test file.
Goodjob!

可以通过以下代码使用 readlines() 方法读取文件的所有行:

file_path = 'example.txt'
with open(file_path, 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())  # 使用 strip() 方法去除每行末尾的换行符

运行这段代码后,将会输出文件的每一行内容:

Hello Python!
This is a test file.
Goodjob!

注意事项

  • 返回的列表中每个元素是一个字符串,包含文件中相应行的内容。
  • 每行末尾的换行符 \n 会被保留在字符串中,如果需要可以使用字符串的 strip() 方法去除。

readlines() 是在需要一次性读取整个文件内容,并且希望将每一行分别处理时非常有用的方法。

readline()

readline() 是 Python 中用于从文件对象中读取单行内容的方法。它按行读取文件,每次调用 readline() 会读取文件的下一行。

readline() 的使用方法

基本语法
line = file.readline(size=-1)
  • size(可选):指定要读取的字节数。默认是 -1,表示读取整行内容,包括行末的换行符。如果提供一个正整数,则会读取指定字节数的内容,直到遇到换行符或到达字节限制。
返回值
  • 返回的内容:读取到的内容是字符串形式的一行(包括行末的换行符)。如果到达文件末尾,则返回一个空字符串 ''
  • 返回值示例
    # 读取到的行
    line = "This is a line of text.\n"
    

示例代码

假设有一个文件 example.txt,内容如下:

Line 1
Line 2
Line 3

以下是使用 readline() 方法读取文件内容的代码示例:

# 打开文件
with open('example.txt', 'r') as file:
    # 读取第一行
    line1 = file.readline()
    print(line1, end='')  # 输出 "Line 1"
    
    # 读取第二行
    line2 = file.readline()
    print(line2, end='')  # 输出 "Line 2"
    
    # 读取第三行
    line3 = file.readline()
    print(line3, end='')  # 输出 "Line 3"
    
   

在这个示例中,readline() 方法每次读取文件的下一行,直到文件结束。

readline() 的高级用法

  1. 指定读取字节数

    可以使用 size 参数指定要读取的字节数,直到遇到换行符或到达字节限制:

    with open('example.txt', 'r') as file:
        line = file.readline(5)  # 读取5个字节
        print(line)  # 可能输出 "Line\n"
    
  2. 读取文件的特定行

    结合 readline() 和循环,可以读取文件中的特定行:

    with open('example.txt', 'r') as file:
        for i in range(2):  # 读取前两行
            line = file.readline()
            print(line, end='')
    
  3. 读取多行内容

    通过循环调用 readline() 方法,可以逐行读取文件内容:

    with open('example.txt', 'r') as file:
        while True:
            line = file.readline()
            if not line:
                break
            print(line, end='')
    

readline() 与 readlines() 的比较

readline() 的常见应用场景

  1. 处理大文件
    逐行读取大文件时比 readlines() 更节省内存,因为它不将整个文件内容加载到内存中。

  2. 文件处理任务
    用于按需读取文件的每一行进行处理,比如日志分析、逐行查找特定内容等任务。

示例代码汇总

以下是一些 readline() 的使用示例:

# 打开文件并读取第一行
with open('example.txt', 'r') as file:
    first_line = file.readline()
    print(f"First line: {first_line.strip()}")

# 读取每一行并处理
with open('example.txt', 'r') as file:
    while True:
        line = file.readline()
        if not line:
            break
        print(f"Processing line: {line.strip()}")

# 使用 readline(size) 读取指定字节数
with open('example.txt', 'r') as file:
    part_of_line = file.readline(4)
    print(f"First 4 bytes of the first line: {part_of_line}")

这些示例展示了如何使用 readline() 读取文件的单行内容、逐行处理文件以及按字节数读取部分内容。

需要注意:

执行完后的指针位置

当每一次执行完readline() ,文件的指针都位于下一行的开头。而执行完readlines()后,文件的指针位于文件末尾。下面这段代码可以看出而执行完readlines()后的指针位置正是位于文件的尾部。

with open('demo.csv', 'r', encoding='gbk') as f:
    f.seek(0, 2)   # 将指针移至文件尾
    print(f.tell())   # 获得文件尾的指针,执行结果238
    f.seek(0)  # # 将指针移至文件头
    lines = f.readlines()
    print(f.tell())   # 执行结果238

 两种方法都是从指定的文件指针作为起点开始读取

with open('demo.csv', 'r', encoding='gbk') as f:
    f.seek(20)  # 将指针移至文件头的20字节
    lines = f.readlines()   # 从指针处开始读取
    print(lines)

或:

with open('demo.csv', 'r', encoding='gbk') as f:
    f.seek(20)  # 将指针移至文件头的20字节
    line = f.readline()   # 从指针处开始读取
    print(line)

 但是如果有汉字字符,需注意不要将汉字的字节拆开,否则会报错。

使用文件指针读取文件最后的几行 

当文件很大,比如是某个运行日志,每次只需要读取最后的几行,就可以采用:

def tail(file_path, num_lines):
    with open(file_path, 'r', encoding='gbk') as f:
        # 将文件指针移到文件末尾
        f.seek(0, 2)
        # 获取文件末尾位置
        end_pos = f.tell()
        lines = []
        line_count = 0
        # 逐行向前读取文件内容,直到达到指定的行数或文件开头
        for pos in range(end_pos - 1, -1, -2):
            f.seek(pos)
            next_char = f.read(1)
            if next_char == '\n':
                # lines.append(f.readline().rstrip('\n'))   用readline()的方法
                line_count += 1
                # f.seek(pos-1)
                if line_count == num_lines:
                    lines = f.readlines()   # 用readlines()的方法
                    break
        # 返回结果,注意如果用readline()的方法要逆序输出
        return lines
        # return lines[::-1]    # 逆序输出


# 调用函数并显示最后5行内容
file_path = 'demo.csv'
num_lines = 5
last_lines = tail(file_path, num_lines)
for line in last_lines:
    print(line.rstrip('\n'))
07-14 07:32