python的readline()和readlines()

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() 读取单行内容 单行字符串 逐行读取文件内容
    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'))
    

    作者:深蓝海拓

    物联沃分享整理
    物联沃-IOTWORD物联网 » python的readline()和readlines()

    发表回复