python的readline()和readlines()

readlines()

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

使用方法和返回值

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

示例说明

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

python 复制代码
Hello Python!
This is a test file.
Goodjob!

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

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

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

python 复制代码
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() 方法读取文件内容的代码示例:

python 复制代码
# 打开文件
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()后的指针位置正是位于文件的尾部。

python 复制代码
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

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

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

或:

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

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

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

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

python 复制代码
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'))
相关推荐
久绊A8 分钟前
Python 基本语法的详细解释
开发语言·windows·python
勤奋的凯尔森同学3 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
软件黑马王子4 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
闲猫4 小时前
go orm GORM
开发语言·后端·golang
丁卯4044 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo4 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李白同学5 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
人间打气筒(Ada)6 小时前
MySQL主从架构
服务器·数据库·mysql
黑子哥呢?6 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
落笔画忧愁e6 小时前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书