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'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Reinforcement Learning: An Introduction》阅读学习笔记

1. 阅读书籍 请问,您读过《Reinforcement Learning: An Introduction》这本书吗?2. 常见英文缩写: MDP:Markov Decision Process,马尔可夫决策过程

JAVA NIO组件之Buffer详解

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Highlight.js示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"…

7.14实训

当我开始学习各种杀毒软件时&#xff0c;我逐渐意识到信息安全在现代社会中的重要性和复杂性。杀毒软件不仅仅是简单的安装和运行&#xff0c;它涉及到广泛的知识领域&#xff0c;包括计算机网络、恶意软件分析、加密技术等等。在这个过程中&#xff0c;我收获了许多宝贵的经验…

代码随想录算法训练营第30天|LeetCode 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

1. LeetCode 452. 用最少数量的箭引爆气球 题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ 文章链接&#xff1a;https://programmercarl.com/0452.用最少数量的箭引爆气球.html 视频链接&#xff1a;https://www…

Java 线程池详解

序言 在高并发编程中&#xff0c;线程池是一个非常重要的组件。它不仅能够有效地管理和复用线程资源&#xff0c;还可以提升应用程序的性能和稳定性。本文将详细介绍Java中的线程池机制&#xff0c;以及如何正确地使用线程池。 一、什么是线程池 线程池是一组已经初始化并等…

索引结构与检索原理

一、mysql索引结构 1.BTree索引 [检索原理] 左边列的表格&#xff08;真实数据&#xff09;&#xff0c;右边对应一棵树&#xff0c;树的管度越来越管查询越快。 以下图表的名称为&#xff1a;段区块 硬盘都是长方形的&#xff0c;打了一个封装&#xff0c;里面是一个圆圈…

二分查找和斐波那契查找

这里写自定义目录标题 二分查找斐波那契查找二分查找改进B二分查找改进C 二分查找 int binSearch(int* arr, int lo, int hi,int target) {while (lo < hi){int mid lo ((hi - lo) >> 1);if (arr[mid] > target) hi mid;else if (arr[mid] < target) lo mi…

springBoot 核心原理

自动配置 包扫描规则&#xff1a; 默认的扫描规则 SpringBootApplication 标注的类就是主程序类 &#xff0c;springBoot也只会扫描主程序类所在的包以及下面的子包也可以自定义声明扫描其他包 使用 SpringBootApplication(scanBasePackages “com.test”)使用 ComponentSca…

《妃梦千年》第三十一章:隐秘交易

第三十一章&#xff1a;隐秘交易 冤案得以昭雪&#xff0c;林清婉内心的重担终于稍稍放下&#xff0c;但她知道&#xff0c;朝中的局势依然复杂&#xff0c;风暴远未平息。她需要更加警惕&#xff0c;以防新的阴谋诡计。就在这个时候&#xff0c;一封密信再次送到她的手中&…

excel、word、ppt 下载安装步骤整理

请按照我的步骤开始操作&#xff0c;注意以下截图红框标记处&#xff08;往往都是需要点击的地方&#xff09; 第一步&#xff1a;下载 首先进入office下载网址&#xff1a; otp.landian.vip 然后点击下载 拉到下方 下载站点&#xff08;这里根据自己的需要选择下载&#x…

c#协变逆变

协变 协变允许你将一个泛型类型的子类型赋值给其父类型的变量。在C#中&#xff0c;协变主要通过以下方式实现&#xff1a; 委托的协变&#xff1a;从C# 4.0开始&#xff0c;委托可以是协变的&#xff0c;这意味着如果 D 继承自 B&#xff0c;则 Action<D> 可以隐式转换为…

汇编语言程序设计-7-高级汇编语言技术

7. 高级汇编语言技术 文章目录 7. 高级汇编语言技术7.0 导学7.1 子程序的另外一种写法-segment/ends-proc/endp7.2 程序的多文件组织7.3 汇编指令汇总7.4 汇编伪操作汇总7.5 汇编操作符汇总7.6 汇编过程7.7 宏汇编7.8 宏库7.9 条件汇编7.10 重复汇编7.11 80x86汇编7.12 汇编语言…

Facebook Research 的 Ocean 框架用于AR和CV的C++库

Ocean 是一个为各种任务设计的组件和库的集合,包括计算机视觉、几何、媒体处理、网络和渲染。以下是对Ocean框架的主要内容的简要概述: 主要目录结构 build/:不同构建系统的构建配置。doc/:包含各种文档。impl/:包含所有源代码。res/:包含所有资源文件,主要用于构建应用…

Typescript 的联合类型和交叉类型

在TypeScript中&#xff0c;联合类型&#xff08;Union Types&#xff09;和交叉类型&#xff08;Intersection Types&#xff09;是两种非常重要的类型系统特性&#xff0c;它们允许你以更灵活和强大的方式表示复杂的类型结构。 联合类型&#xff08;Union Types&#xff09;…

前端部署自动上传资源文件到cdn/oss 解决路由和访问慢的问题

参考文档&#xff1a;webpack-aliyun-oss-plugin - npm 安装依赖&#xff0c;这是一个预编译环境下的包 npm install webpack-aliyun-oss-plugin --save-dev 以下代码的意思是&#xff1a; webpack中引入一个oss上传插件&#xff0c;并且给予其初始参数&#xff0c;插件根据p…

认知偏差知识手册

The Connector 每周会选取我从信息流里获取的有价值内容&#xff0c;包括 AI 探索专题、Github 开源库推荐、工具介绍和一些文章书籍等&#xff0c;目标是链接互联网上的优质内容&#xff0c;获得更多的灵感和知识&#xff0c;从而激发彼此的创造力。 AI 探索 主流推理框架在…

NAT地址转换+多出口智能选路,附加实验内容

本章主要讲&#xff1a;基于目标IP、双向地址的转换 注意&#xff1a;基于目标NAT进行转换 ---基于目标IP进行地址转换一般是应用在服务器端口映射&#xff1b; NAT的基础知识 1、服务器映射 服务器映射是基于目标端口进行转换&#xff0c;同时端口号也可以进行修改&…

中介者模式(大话设计模式)C/C++版本

中介者模式 C // 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示得相互引用&#xff0c;从而使得其耦合松散&#xff0c;而且可以独立地改变他们之间得交互#include <iostream> #include <string>using namespace std;#d…

Nginx 限流功能,流量控制功能详解

Nginx 提供了强大的流量控制功能。限制客户端在特定时间段内的请求次数&#xff0c;以保护服务器资源&#xff0c;防止因过载而导致的性能下降甚至服务不可用。限流在防止DDoS攻击、爬虫过度抓取和滥用API等方面有着重要作用。这里将详细介绍Nginx限流的工作原理、配置方法、各…