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'))
相关推荐
两个人的幸福3 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
zzzzzz3103 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
BingoGo5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982075 天前
PHP 扩展——从入门到理解
php
鹏仔先生6 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
LDR0066 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术6 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园6 天前
C++20 Modules 模块详解
java·开发语言·spring