Python seek()和tell()函数详解

news2024/9/23 3:19:29

在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针。

我们知道,使用 open() 函数打开文件并读取文件中的内容时,总是会从文件的第一个字符(字节)开始读起。那么,有没有办法可以自定指定读取的起始位置呢?答案是肯定,这就需要移动文件指针的位置。

文件指针用于标明文件读写的起始位置。假如把文件看成一个水流,文件中每个数据(以 b 模式打开,每个数据就是一个字节;以普通模式打开,每个数据就是一个字符)就相当于一个水滴,而文件指针就标明了文件将要从文件的哪个位置开始读起。图 1 简单示意了文件指针的概念。

图 1 文件指针概念示意图

可以看到,通过移动文件指针的位置,再借助 read() 和 write() 函数,就可以轻松实现,读取文件中指定位置的数据(或者向文件中的指定位置写入数据)。

注意,当向文件中写入数据时,如果不是文件的尾部,写入位置的原有数据不会自行向后移动,新写入的数据会将文件中处于该位置的数据直接覆盖掉。

实现对文件指针的移动,文件对象提供了 tell() 函数和 seek() 函数。tell() 函数用于判断文件指针当前所处的位置,而 seek() 函数用于移动文件指针到文件的指定位置。

tell() 函数

tell() 函数的用法很简单,其基本语法格式如下:

file.tell()

其中,file 表示文件对象。

例如,在同一目录下,编写如下程序对 a.txt 文件做读取操作,a.txt 文件中内容为:

http://csdn.net

读取 a.txt 的代码如下:

f =open("a.txt",'r')
print(f.tell())
print(f.read(3))
print(f.tell())

运行结果为:

0
htt
3

可以看到,当使用 open() 函数打开文件时,文件指针的起始位置为 0,表示位于文件的开头处,当使用 read() 函数从文件中读取 3 个字符之后,文件指针同时向后移动了 3 个字符的位置。这就表明,当程序使用文件对象读写数据时,文件指针会自动向后移动:读写了多少个数据,文件指针就自动向后移动多少个位置。

seek()函数

seek() 函数用于将文件指针移动至指定位置,该函数的语法格式如下:

file.seek(offset[, whence])

其中,各个参数的含义如下:

  • file:表示文件对象;

  • whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。

  • offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当whence == 0 &&offset == 3(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当whence == 1 &&offset == 5(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。

注意,当 offset 值非 0 时,Python 要求文件必须要以二进制格式打开,否则会抛出 io.UnsupportedOperation 错误。

下面程序示范了文件指针操作:

f =open('a.txt','rb')
# 判断文件指针的位置
print(f.tell())
# 读取一个字节,文件指针自动后移1个数据
print(f.read(1))
print(f.tell())
# 将文件指针从文件开头,向后移动到 5 个字符的位置
f.seek(5)
print(f.tell())
print(f.read(1))
# 将文件指针从当前位置,向后移动到 5 个字符的位置
f.seek(5,1)
print(f.tell())
print(f.read(1))
# 将文件指针从文件结尾,向前移动到距离 2 个字符的位置
f.seek(-1,2)
print(f.tell())
print(f.read(1))

运行结果为:

0
b'h'
1
5
b'/'
11
b'a'
21
b't'

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

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

相关文章

分布式事务实现机制及二阶段提交

注:本文章引自终于把分布式事务讲明白了! 分布式事务 分布式事务是指在分布式环境下事务,一个事务由多个数据库节点共同完成。分布式事务也必须要保证事务的ACID的特性。 实现分布式事务原子性的通常做法就是采用两阶段提交协议&#xff0c…

07- Rossmann商店销售预测 (Xgboost集成算法) (项目七)

查看数据是否为空: train.isnull().sum()查看特征元素: train[StateHoliday].unique() # array([0, a, b, c], dtypeobject)绘制热力图: sns.heatmap(df_train.corr(),cmap RdYlGn_r,annotTrue,vmin -1,vmax1)合并商店信息和销售数据: train pd.merge(train, store, on …

高校房产管理系统有哪些管理功能范围?

数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平台,是针对中国高校房产的管理特点和管理要求,研发的一套标准产品;通过在中国100多所高校的成功实施和迭代,形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。…

世界上最健康的程序员作息表!「值得一看」

昨晚看了一篇“传说中”的“世界上最健康的作息时间表”,开始纠结自己还要不要5点半起床。 都说程序员这一行,猝死概率极高,究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章,还是非常值得参考的&#…

基于Java+SpringBoot+Vue+Uniapp前后端分离商城系统设计与实现

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…

PyQt5 界面预览工具

简介 一款为了预览PyQt5设计的UI界面而开发的工具,使用时需要结合PyCharm同时使用。 下载 PyQt5界面预览工具 参数说明 使用配置 启动PyCharm,找到File -> Settings,打开 找到Tools -> External Tools点击打开,在新界面…

GuLi商城-SpringCloud Alibaba-Nacos注册中心

简介: Nacos(Dynamic Naming and Configuration Service)是构建以 “服务” 为中心的现代应用架构 (例 如微服务范式、云原生范式) 的服务基础设施。致力于服务发现、配置和管理,且提供了一组简单 易用的特性集。让微服务的发现…

GEE学习笔记 八十一:【GEE之Python版教程十二】

这一节介绍一下日期类,那么GEE基础的类型基本上介绍完成。后续开始介绍GEE在遥感GIS处理上的一些API内容,比如矢量数据、栅格数据处理等。 这段代码是在程序之前必须执行的,用来注册GEE。 import ee ee.Initialize() 1、日期类API 首先看一…

C语言-文件操作-10

题目&#xff1a; 修改下列程序&#xff0c;用命令行界面代替交互式界面 #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFSIZE 4096 #define SLEN 81 void append(FILE * source,FILE * dest); char * s_gets(char * st,int n); i…

Spring3定时任务

简介 Spring 内部有一个 task 是 Spring 自带的一个设定时间自动任务调度&#xff0c;提供了两种方式进行配置&#xff0c;一种是注解的方式&#xff0c;而另外一种就是 XML 配置方式了;注解方式比较简洁&#xff0c;XML 配置方式相对而言有些繁琐&#xff0c;但是应用场景的不…

借助 APISIX Ingress,实现与注册中心的无缝集成

作者张晋涛&#xff0c;API7.ai 云原生技术专家&#xff0c;Apache APISIX PMC 成员&#xff0c;Apache APISIX Ingress Controller 项目维护者。 原文链接 云原生场景下是否需要服务发现 背景 微服务架构是当前最为流行的应用架构之一。 应用被拆分为多个服务组件&#xff…

流批一体架构在快手的实践和思考

摘要&#xff1a;本文整理自快手技术专家、Apache Flink & Apache Calcite Committer 张静&#xff0c;在 FFA 流批一体专场的分享。本篇内容主要分为四个部分&#xff1a;Flink 在快手的发展流批一体在快手的规划第一阶段&#xff08;加强批能力&#xff09;的进展第二阶段…

什么是refresh?Spring refresh 流程

refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#xff0c;我们把它们称为 refresh 的 12 个步骤&#xff1a;1. prepareRefresh2. obtain…

js将数字转十进制+十六进制(联动el-ui下拉选择框)

十进制与十六进制的整数转化一、十进制转十六进制二、十六进制转十进制三、联动demo一、十进制转十六进制 正则表达式&#xff1a; /^([0-9]||([1-9][0-9]{0,}))$/解析&#xff1a;[0-9]代表个位数&#xff0c;([1-9][0-9]{0,})代表十位及以上 二、十六进制转十进制 正则表达…

问卷数据分析流程

文章目录一、数据合并1. 读取数据2. 数据预览二、数据清洗1. 检验ID是否重复&#xff0c;剔除ID重复项2. 剔除填写时间小于xx分钟的值3.处理 量表题 一直选一个选项的问题三、数据清洗1.1 将问卷单选题的选项code解码&#xff0c;还原成原来的选项1.2 自动获取单选题旧的选项列…

object类的equals和hashCode

Object类–基类 equals方法 Object类中的equals方法,底层是用的是""来实现的, 如果比较的两个数是基本类型,就是在比较其值是否相等; 如果比较的两个数是引用数据类型,那么就是比较其地址是否相等 如果输出语句是System.out.println(ab) 输出的是false ,因为a和b …

AcWing 841. 字符串哈希

题目描述 分析&#xff1a; 字符串 hash 小试牛刀 我们在之前模拟散列时&#xff0c;设置的哈希函数为将一个元素(element, e)输入哈希函数中&#xff0c;输出是一个整数&#xff0c;而那时的 eee 为一个有范围的整数。现在我们考虑更复杂的情形&#xff0c;eee 为一个字符串…

论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

NeRF使用神经网络来表示场景。给定一个场景&#xff0c;输入该场景稀疏的视角图片&#xff0c;NeRF可以合成该场景新的视角的图片。 神经辐射场 神经辐射场&#xff08;neural radiance field&#xff0c;NeRF&#xff09;使用5D的向量值函数表示一个场景。 输入是连续的5D坐…

LeetCode 160. 相交链表

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你两个单链表的头节点 headAheadAheadA 和 headBheadBheadB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 nullnullnull 。 图示两个链表在节点 c1…

分享12款我常用的开源免费软件

嗨,大家好, 我是徐小夕, 在一个劳动力追求高性价的时代, 我们无时无刻不在追寻更高的工作学习效率, 提高工作舒适度,接下来我就和大家分享一下我之前用过的, 能提高工作效率的开源免费工具.1. 修图&#xff1a;Krita 【开源】image.png地址: https://krita.org/zh/Krita 是一款…