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'))
相关推荐
羑悻的小杀马特37 分钟前
把随身WiFi改成网盘聚合器:中兴F50挂载本地存储+夸克网盘实战
运维·服务器·人工智能·网盘·openlist
Scott9999HH8 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海9 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨10 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
吳所畏惧12 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈12 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
人邮异步社区12 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大13 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf