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

【文章内容结束】

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qslife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值