python3文件对象方法seek()心得

python3文件对象方法seek()心得

本文环境: Windows 10 专业版 64 位 + Thonny 3.2.6

概述

python3中文件对象的方法 seek() 用于移动文件读写指针到指定位置。

语法

file_object.seek(offset[, whence])

参数说明

file_object 是文件对象,通常是通过函数 open() 返回的。
offset 是一个整数,表示文件读写指针要从 whence 指定的位置移动的数量。
正数是从文件读写指针向文件尾部移动。负数从文件读写指针向文件头部移动。负数只能用于 b 字节模式打开的文件对象。
whence 是一个可选参数,默认值为 0,表示从文件开头开始计算 offset偏移量 。
whence 的其他可选值有:
0:表示文件开头(默认值)。
1:表示当前位置。
2:表示文件结尾。

实例

实例环境:
e:\test\test-en.txt
test-en.txt 内容:
0123456789abcdeABCDE
test-en.txt 编码:utf-8
在这里插入图片描述

seek(0) seek(0,0) 移动指针到文件头

上机代码:

#  文件对象的方法 seek(0) 训练
# 使用 r+ 读写模式打开文件
file_object = open("test-en.txt","r+")
print("r+ 读写模式打开文件后,文件读写指针在文件头:",file_object.tell())
# 使用文件对象的方法 read() 读取文件内容
contents = file_object.read()
print("第1次 read() 文件内容后的结果:\n",contents)
print("read() 读取文件内容后,文件读写指针在文件末尾:",file_object.tell())
print("由于文件指针在文件末尾,所以无法再次读取出文件内容")
contents = file_object.read()
print("第2次 read() 文件内容后的结果:\n",contents)

print("使用文件对象的方法 seek(0) 把文件读写指针移动到文件头")
file_object.seek(0)
print("显示 file_object.seek(0) 后的文件读写指针的位置:",file_object.tell())
contents = file_object.read()
print("第3次把文件读写指针调整到文件头后,\nread() 文件内容的结果:\n",contents)

print("""seek(0) 是 seek(0,0) 省略了参数 whence ,whence 省略时默认值是0
seek(0,0) offset = 0 whence = 0
offset = 0 :文件读写指针从 whence 指定的位置向文件尾部移动的0字节。
whence = 0 : 文件读写指针移动到文件头。
""")

#关闭文件
file_object.close()

结果:

>>> %Run test.py
r+ 读写模式打开文件后,文件读写指针在文件头: 01次 read() 文件内容后的结果:
 0123456789abcdeABCDE


read() 读取文件内容后,文件读写指针在文件末尾: 24
由于文件指针在文件末尾,所以无法再次读取出文件内容
第2次 read() 文件内容后的结果:
 
使用文件对象的方法 seek(0) 把文件读写指针移动到文件头
显示 file_object.seek(0) 后的文件读写指针的位置: 03次把文件读写指针调整到文件头后,
read() 文件内容的结果:
 0123456789abcdeABCDE


seek(0) 是 seek(0,0) 省略了参数 whence ,whence 省略时默认值是0
seek(0,0) offset = 0 whence = 0
offset = 0 :文件读写指针从 whence 指定的位置向文件尾部移动的0字节。
whence = 0 : 文件读写指针移动到文件头。

>>> 

seek(offset = 负数)向文件头部移动文件读写指针(open(b)模式可用)

上机代码:

# 文件对象的方法 seek(offset = 负数) 训练
# 使用 rb+ 字节(二进制)读写模式打开文件
file_object = open("test-en.txt","rb+")
print("rb+ 字节(二进制)读写模式打开文件后,文件读写指针在文件头:",file_object.tell())
# 使用文件对象的方法 read() 读取文件内容
contents = file_object.read()
print("第1次 read() 文件内容后的结果:\n",contents)
print("read() 读取文件内容后,文件读写指针在文件末尾:",file_object.tell())
print("由于文件指针在文件末尾,所以无法再次读取出文件内容")
contents = file_object.read()
print("第2次 read() 文件内容后的结果:\n",contents)

print("使用文件对象的方法 seek(-24,1) 把文件读写指针移动到文件头")
print("offset = -24 :文件读写指针从 whence 向文件头部移动24个字符。")
print("offset 正数文件读写指针向文件尾部移动,负数文件读写指针向文件头部移动。")
print("offset 为负数只能在 b 模式下使用。")
print("whence = 1 : 文件读写指针移动到当前位置")
print("由于当前位置就是文件尾部,文件的长度是24,所以 offset = -24 文件读写指针移动回了文件开头 0 。") 
file_object.seek(-24,1)
print("显示 file_object.seek(-24,1) 后的文件读写指针的位置:",file_object.tell())
contents = file_object.read()
print("第3次把文件读写指针调整到文件头后,\nread() 文件内容的结果:\n",contents)

#关闭文件
file_object.close()

结果:

>>> %Run test.py
rb+ 字节(二进制)读写模式打开文件后,文件读写指针在文件头: 01次 read() 文件内容后的结果:
 b'0123456789abcdeABCDE\r\n\r\n'
read() 读取文件内容后,文件读写指针在文件末尾: 24
由于文件指针在文件末尾,所以无法再次读取出文件内容
第2次 read() 文件内容后的结果:
 b''
使用文件对象的方法 seek(-24,1) 把文件读写指针移动到文件头
offset = -24 :文件读写指针从 whence 向文件头部移动24个字符。
offset 正数文件读写指针向文件尾部移动,负数文件读写指针向文件头部移动。
offset 为负数只能在 b 模式下使用。
whence = 1 : 文件读写指针移动到当前位置
由于当前位置就是文件尾部,文件的长度是24,所以 offset = -24 文件读写指针移动回了文件开头 0 。
显示 file_object.seek(-24,1) 后的文件读写指针的位置: 03次把文件读写指针调整到文件头后,
read() 文件内容的结果:
 b'0123456789abcdeABCDE\r\n\r\n'
>>> 

中文字符下的seek(offset = 3的倍数)

实例环境:
e:\test\test-ch.txt
test-ch.txt 内容:
一二三四五六七八九十
test-ch.txt 编码:utf-8
在这里插入图片描述

文件对象的内置函数 open() 中文字符时要加上参数“encoding = “utf-8””
file_object = open(“test-ch.txt”,“r+”,encoding = “utf-8”)

上机代码:

# 文件对象的方法 seek() 中文字符训练
file_object = open("test-ch.txt","r+",encoding = "utf-8")
contents = file_object.read()
print(contents)
print("read() 之后文件指针在文件末尾:",file_object.tell())
# 结果是34
print("""一个utf-8的汉字占3个长度,我的系统中这行汉字尾部有'\ r \ n'。
10个汉字 * 3 = 30 + 尾部4个 = 34
指针的偏移量 offset 要是 3 的倍数,
例如要移动到三, offset = 9
""")
file_object.seek(9,0)
print("file_object.seek(9,0)后文件读写指针的位置:",file_object.tell())
contents = file_object.read()
print(contents)

file_object.close()

结果:

>>> %Run test.py
一二三四五六七八九十


read() 之后文件指针在文件末尾: 34
一个utf-8的汉字占3个长度,我的系统中这行汉字尾部有'\ r \ n'10个汉字 * 3 = 30 + 尾部4= 34
指针的偏移量 offset 要是 3 的倍数,
例如要移动到三, offset = 9 
file_object.seek(9,0)后文件读写指针的位置: 9
四五六七八九十


>>> 

如果 offset 的数量不是3的倍数,系统会提示错误。我们加入以下代码:

print("如果文件读写指针不移动3的倍数")
file_object.seek(2,0)
contents = file_object.read()
print(contents)

offset 的数量不是3的倍数,上机代码:

# 文件对象的方法 seek() 中文字符训练
file_object = open("test-ch.txt","r+",encoding = "utf-8")
contents = file_object.read()
print(contents)
print("read() 之后文件指针在文件末尾:",file_object.tell())
# 结果是34
print("""一个utf-8的汉字占3个长度,我的系统中这行汉字尾部有'\ r \ n'。
10个汉字 * 3 = 30 + 尾部4个 = 34
指针的偏移量 offset 要是 3 的倍数,
例如要移动三, offset = 9
""")
file_object.seek(9,0)
print("file_object.seek(9,0)后文件读写指针的位置:",file_object.tell())
contents = file_object.read()
print(contents)

print("如果文件读写指针不移动3的倍数")
file_object.seek(2,0)
contents = file_object.read()
print(contents)

file_object.close()

结果:

>>> %Run test.py
一二三四五六七八九十


read() 之后文件指针在文件末尾: 34
一个utf-8的汉字占3个长度,我的系统中这行汉字尾部有'\ r \ n'10个汉字 * 3 = 30 + 尾部4= 34
指针的偏移量 offset 要是 3 的倍数,
例如要移动三, offset = 9

file_object.seek(9,0)后文件读写指针的位置: 9
四五六七八九十


如果文件读写指针不移动3的倍数
[Could not import friendly_traceback. You can install it with Tools => Manage packages]

Traceback (most recent call last):
  File "E:\test\test.py", line 19, in <module>
    contents = file_object.read()
  File "C:\Program Files (x86)\Thonny\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
>>> 

【文章内容结束】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA&#xff08;PLoRA&#xff09;的参数高效微调&#xff08;Parameter-…

C++第十弹---类与对象(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、再谈构造函数 1.1、构造函数体赋值 1.2、初始化列表 1.3、explicit关键字 2、static成员 2.1、概念 2.2、特性 2.3、面试题 总结 1、再…

一个极简的用于 Web 服务鉴权的反向代理服务

Auth Proxy 一个极简的用于 Web 服务鉴权的反向代理服务 Demo&#xff08;密码为&#xff1a;whoami&#xff09;&#xff1a;https://auth-proxy.wengcx.top/ 极其简约的 UI对你的真实服务无任何侵入性支持容器部署&#xff0c;Docker Image 优化到不能再小&#xff08;不到…

DS-红黑树(RBTree)

一.红黑树 1.1 红黑树的起源 当对对AVL树做一些结构修改的操作时候&#xff0c;性能较为低下&#xff0c;比如&#xff1a;插入时要维护其绝对平衡&#xff0c;旋转的次数比较多&#xff0c;更差的是在删除时&#xff0c;有可能一直要让旋转持续到根的位置。 因此1972年Rudolf…

极大提高工作效率的 Linux 命令

作为一名软件开发人员&#xff0c;掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS&#xff0c;你总会遇到需要使用 Linux 命令的场合。例如&#xff0c;大多数 Docker 镜像都基于 Linux 系统。要进行 DevOps 工作&#xff0c;你需要熟悉Linux&#xff0c;至少要…

数据库被.[Goodmorningfriends@onionmail.org].faust勒索病毒加密,能恢复吗?

.faust勒索病毒有什么特点及危害&#xff1f; .faust勒索病毒是一种恶意软件&#xff0c;以其复杂的加密技术和勒索行为而闻名。这种病毒的主要目标是通过加密受害者的数据文件&#xff0c;然后勒索赎金以解密这些文件。它通常通过恶意附件、恶意链接或潜在的不安全下载源传播&…

网络编程套接字——实现简单的TCP网络程序

目录 1、TCP socket API详解 socket()&#xff1a; bind()&#xff1a; listen(): accept(): connect(): 2、简易的TCP网络程序 TcpServer.hpp TcpClient.cc Main.cc Log.hpp ThreadPool.hpp Task.hpp Init.hpp Daemon.hpp dict.txt Makefile 1、TCP socket A…

第六十二回 宋江兵打大名城 关胜议取梁山泊-飞桨ONNX推理部署初探

石秀和卢俊义在城内走投无路&#xff0c;又被抓住。梁中书把他两个人押入死牢。蔡福把他俩关在一处&#xff0c;好酒好菜照顾着&#xff0c;没让两人吃苦。 第二天就接到城外梁山泊的帖子&#xff0c;说大军已经来到&#xff0c;要替天行道&#xff0c;让他放人&#xff0c;并…

数据结构从入门到精通——快速排序

快速排序 前言一、快速排序的基本思想常见方式通用模块 二、快速排序的特性总结三、三种快速排序的动画展示四、hoare版本快速排序的代码展示普通版本优化版本为什么要优化快速排序代码三数取中法优化代码 五、挖坑法快速排序的代码展示六、前后指针快速排序的代码展示七、非递…

【Netty】TCP粘包、拆包、编解码问题

TCP粘包、拆包、编解码问题 UserInfo userInfo1new UserInfo();ByteBuf buf Unpooled.copiedBuffer(userInfo1.toString().getBytes(StandardCharsets.UTF_8));UserInfo userInfo1new UserInfo(); 这行代码创建了一个新的UserInfo对象&#xff0c;并将其引用存储在名为userInf…

力扣242. 有效的字母异位词

思路&#xff1a;字母相互抵消的思路&#xff0c;本题字符串中只包含小写字母26位&#xff0c;那就新建record数组int[26]&#xff0c;下标0-25&#xff0c;代表小写字母a-z, 需要通过 某字符减a 来达到这一目的&#xff1b; class Solution {public boolean isAnagram(String…

Tomcat 下载以及安装

Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;首先确认自己是否已经安装JDK 1. cmd&#xff1a;查看java的版本 步骤二&#xff1a;下载安装Tomcat 1. 下载tomcat :Apache Tomcat - Welcome! 2. 选择对应的tomcat版本&#xff1a; 3. 进行安装&#…

如何使用 Elasticsearch 作为向量数据库

在今天的文章中&#xff0c;我们将很快地通过 Docker 来快速地设置 Elasticsearch 及 Kibana&#xff0c;并设置 Elasticsearch 为向量搜索。 拉取 Docker 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2 docker pull docker.elastic.co/kibana/kiba…

Red Hat Enterprise Linux 9.2

Red Hat Enterprise Linux 9.2的安装 插入安装光盘&#xff0c;从光盘启动&#xff0c;选择 第一个选项&#xff0c;安装Red Hat Enterprise Linux 9.2 9.2支持简体中文 此次安装选择了英文安装&#xff0c;估计在生产环境大多也是选择的英文安装 安装选项此次也是选择的mi…

利用MSF生成php,windows,Linux三类木马

一、什么是msfvenom&#xff1f; msfvenom是msf中的一个独立的负载生成器&#xff0c;它可以利用msf中的payloads和encoders来生成各种格式的木马文件&#xff0c;并在目标机上执行&#xff0c;配合meterpreter在本地监听上线。msfvenom是msfpayload和msfencode的结合体&#x…

保姆级教学 - C语言 之 动态内存管理

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分79.9)&#xff0c;分…

shell常用通配符

目录 介绍 示例 * ? [a,b,...] / [ab...] [^a,b,...] / [^ab...] [x1-x2] {"xxx","xxx","xxx",...} {x1..x2} 介绍 示例 * 匹配0或多个字符 ls的-d选项可以只列出当前目录下的文件,而不会列出他们包含的内容: ? 只匹配任意一个字符 …

MySQL基础(DDL,DML,DQL)

目录 一DDL 1.1数据库操作 1.1.1查询所有数据库&#xff1a; 1.1.2创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2表操作 1.2.1表操作 1.2.1.1创建表 1.2.1.1.1约束 1.2.1.1.2 数据类型 1.2.1.1.2.1 数值类型 1.2.1.1.2.2 字符串类型 1.2.1.1.2.3日期类型 1.…

Linux源码包安装

目录 一、transmission源码包安装 二、 nginx源码包安装 一、transmission源码包安装 1、下载编译环境所需的软件包依赖 2、下载transmision源码包到用户主目录下 https://github.com/transmission/transmission/releases/download/4.0.5/transmission-4.0.5.tar.xz 3、解压…

支持度和置信度

支持度和置信度是数据挖掘和关联规则挖掘领域中常用的两个指标&#xff0c;用于衡量项集之间的关联程度。 支持度&#xff08;Support&#xff09;&#xff1a;支持度是指某个项集在数据集中出现的频率&#xff0c;即该项集在数据集中出现的次数与总事务数之比。支持度用来衡量…