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

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

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

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

图 1 文件指针概念示意图

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

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

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

tell() 函数

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

file.tell()

其中,file 表示文件对象。

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

http://c.biancheng.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'

注意:由于程序中使用 seek() 时,使用了非 0 的偏移量,因此文件的打开方式中必须包含 b,否则就会报 io.UnsupportedOperation 错误,有兴趣的读者可自定尝试。

上面程序示范了使用 seek() 方法来移动文件指针,包括从文件开头、指针当前位置、文件结尾处开始计算。运行上面程序,结合程序输出结果可以体会文件指针移动的效果。

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

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

相关文章

n=n+1 放在print(s)的前/后的影响

# 123456.....100 ?#关键在于,当n为时,才print(s)n 1s 0while n < 101: s s n if n 100: #关键在于这一步, 我用if来判断,当n为100时,才print(s), 否则继续while循环 print(s) n n 1          转载于:https://www.cnblogs.co…

ScrollReveal.js – 帮助你实现超炫的元素运动效果

ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果&#xff0c;帮助你的网站增加吸引力。只需要给元素增加 data-scrollreveal 属性&#xff0c;当元素进入可视区域的时候会自动被触发设置好的动画。 您可能感兴趣的相关文章2013年最受欢迎的10篇前端开发博文小伙伴…

JDBC布尔兼容性列表

有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问汤姆”的观点&a…

linux用户操作的日志,linux 用户操作记录并录入日志

1. 添加bash全局配置文件&#xff1a;cd /etc/profile.dvi log_command.sh输入如下内容&#xff1a;export PROMPT_COMMAND‘RETRN_VAL$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\[ ]*//" ) [$RETRN_VAL]"‘2. 添加rsy…

我实在不懂Python的Asyncio

原语 事件循环(Event Loop)Awaitables和CoroutinesCoroutine WrappersAwaitables and FuturesTasksHandlesExecutorsTransport and Protocols如何使用Asyncio上下文数据个人想法这是Flask&#xff0c;Sentry的作者Armin Ronacher的一篇博客&#xff0c;这篇文章的影响很大&…

GDI+与WPF中的颜色简析

GDI与WPF中的颜色简析 原文:GDI与WPF中的颜色简析--------------------------------------------------------------------------------引用或转载时请保留以下信息&#xff1a;大可山 [MSN:a3news(AT)hotmail.com] http://www.zpxp.com http://www.brawdraw.com萝卜鼠在线图形…

pythondatetime_Date

在JavaScript中&#xff0c;Date对象用来表示日期和时间。要获取系统当前时间&#xff0c;用&#xff1a;var now new Date();now; // Wed Jun 24 2015 19:49:22 GMT0800 (CST)now.getFullYear(); // 2015, 年份now.getMonth(); // 5, 月份&#xff0c;注意月份范围是0~11&…

Panorama Viewer – jQuery 360度全景展示插件

jQuery Panorama Viewer 这款插件可以帮助你在网站中嵌入全景图片。要做到这一点&#xff0c;首先只需要在页面中引入最新的 jQuery 库&#xff0c;以及 jquery.panorama_viewer.js 和 panorama_viewer.css 到页面中&#xff0c;然后给图片添加 CSS 类“panorama”。现代浏览器…

优化您的ApplicationContext

Spring有一个问题&#xff0c;已经存在了一段时间&#xff0c;我在许多项目中都遇到过。 与Spring或Spring的Guys无关&#xff0c;这取决于像您和我这样的Spring用户。 让我解释一下……在Spring 2的过去&#xff0c;您必须手动配置Application Context&#xff0c;手动创建一个…

linux多线程编程(中嵌教育-嵌入式linux开发课件),linux多线程编程(中嵌教育-嵌入式linux开发课件).ppt...

linux多线程编程(中嵌教育-嵌入式linux开发课件).pptlinux多线程编程 Linux下线程概述 linux线程实现 1、Linux下线程概述 进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。 线程通常叫做轻型的进程。线程是在共享内存空间中并发执行的多道…

oracle group by 多类别_python数据关系型图表散点图系列多数据系列

多数据系列多数据系列的散点图需要使用不同的填充颜色(fill)和数据点形状(shape)这两个视觉特征来表示数据系列&#xff1b;绘制多数据系列散点图多数据系列散点图就是在单数据系列上添加新的数据系列&#xff1b;使用不同的填充颜色或形状区分数据系列&#xff1b;plotnine绘制…

图片和视频压缩例子

/*** 视频压缩 需要jave jar 包。到网上下载即可 * * param source 需要压缩的视频* param targetPath 压缩的目标路径* return*/public static boolean compressVideo(File source, String targetPath) {System.out.println("source:" source);System.out.println…

Web 开发中应用 HTML5 技术的10个实例教程

HTML5 作为下一代网站开发技术&#xff0c;无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者&#xff0c;都值得去研究。借助尖端功能&#xff0c;技术和 API&#xff0c;HTML5 允许你创建响应性、创新性、互动性以及令人惊叹的漂亮网站。更进一步&#xff0c;你也可以…

linux ptrace 内核源码分析,linux 3.5.4 ptrace源码分析分析(系列一)

ptrace是linux系统中为了调试专门设立的一种系统调用。要想调试调试一个进程&#xff0c;有两种方式&#xff1a;PTRACE_TRACEME和PTRACE_ATTACH。这两种方式的主要区别可以概括为&#xff1a;PTRACE_TRACEME是子进程主动申请被TRACE。而PTRACE_ATTACH是父进程自己要attach到子…

在单元测试中访问私有字段

首先&#xff0c;让我大声说一下&#xff0c;您需要将代码设计为可测试的&#xff0c;以便通过公共方法测试私有字段。 但是&#xff0c;&#xff08;“ buts”是人们仍在编程而不是计算机本身的原因&#xff0c;所以在这里很高兴&#xff09;有时您想要并且应该更改一些私有字…

【LeetCode题解】160_相交链表

目录 160_相交链表描述解法一&#xff1a;哈希表思路Java 实现Python 实现解法二&#xff1a;双指针&#xff08;推荐&#xff09;思路Java 实现Python 实现160_相交链表 描述 编写一个程序&#xff0c;找到两个单链表相交的起始节点。 例如&#xff0c;下面的两个链表&#xf…

maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...

前言&#xff1a;原本目的是想寻求一种方式来对cpu计算密集型代码部分进行加速替代&#xff0c;但是maya中mll插件的插件套路在传递参数上会占用大量的io&#xff0c;对于数据比较大的部分也会有相当消耗。如果全部写在c部分又感觉缺乏灵活性&#xff0c;所以琢磨的一种可以在p…

VS2010中预处理器定义

vs2010下的预处理器定义就是使该预定义下的宏定义在每个文件中都包括&#xff0c;便于跨平台编码格式或者其他的一些设置&#xff0c;便于处理&#xff0c;值得注意的是工程移植的时候需要考虑预处理定义否则代码运行的环境可能不同&#xff0c;导致结果出错。 详解&#xff1a…

Slip.js – 在触摸屏上实现 Swipe 对列表重新排序

Slip.js 是一个很小的 JavaScript 库&#xff0c;用于实现对触摸屏的互动 Swipe 和对元素重新排序列表&#xff08;Reordering&#xff09;。Slip.js 没有任何的依赖&#xff0c;你可以通过自定义 DOM 事件实现重新排序交互。 您可能感兴趣的相关文章Pace.js – 页面加载进度自…

suse10 linux安装,SuSE10.2 安装手记

SuSE10.2 安装手记发布时间:2007-04-05 00:31:51来源:红联作者:Reference1. 添加安装源SuSE提供了多种安装源的管理&#xff0c;你可以通过Yast方便的添加和删除各种安装源。(1) 本地安装源&#xff1a;YaST -> Software -> Installation Source -> Add -> Local D…