当前位置: 首页 > news >正文

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:breakprint(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:breakprint(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())   # 获得文件尾的指针,执行结果238f.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'))

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Hadoop基础组件介绍!
  • 【Git】Git Submodules 介绍(通俗易懂,总结了工作完全够用的 submodule 命令)
  • 签名优化:请求数据类型不是`application/json`,将只对随机数进行签名计算,例如文件上传接口。
  • 网络编程-TCP 协议的三次握手和四次挥手做了什么
  • Spark安装
  • npm安装依赖包报错,npm ERR! code ENOTFOUND
  • 介绍下项目的架构
  • 【精简版】jQuery 中的 Ajax 详解
  • 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】
  • 如何用EXCEL自动解方程/方程组?利用 矩阵乘法X=A-*B,X=mmult(minverse(A), B)
  • PHP手边酒店多商户版平台小程序系统源码
  • 前缀匹配工具之IP-Prefix
  • Web控件进阶交互
  • 链路聚合概述
  • AutoMQ 生态集成 Redpanda Console
  • [NodeJS] 关于Buffer
  • 10个确保微服务与容器安全的最佳实践
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java的Interrupt与线程中断
  • Java反射-动态类加载和重新加载
  • Js基础——数据类型之Null和Undefined
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从零开始学习部署
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 高性能JavaScript阅读简记(三)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 智能合约Solidity教程-事件和日志(一)
  • Nginx实现动静分离
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #if #elif #endif
  • #pragma data_seg 共享数据区(转)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $$$$GB2312-80区位编码表$$$$
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2.2w字)前端单元测试之Jest详解篇
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Git) gitignore基础使用
  • (NSDate) 时间 (time )比较
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (五)MySQL的备份及恢复
  • (五)关系数据库标准语言SQL
  • (一) springboot详细介绍
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)编辑寄语:因为爱心,所以美丽
  • .mysql secret在哪_MYSQL基本操作(上)