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+ 读写模式打开文件后,文件读写指针在文件头: 0
第1次 read() 文件内容后的结果:
0123456789abcdeABCDE
read() 读取文件内容后,文件读写指针在文件末尾: 24
由于文件指针在文件末尾,所以无法再次读取出文件内容
第2次 read() 文件内容后的结果:
使用文件对象的方法 seek(0) 把文件读写指针移动到文件头
显示 file_object.seek(0) 后的文件读写指针的位置: 0
第3次把文件读写指针调整到文件头后,
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+ 字节(二进制)读写模式打开文件后,文件读写指针在文件头: 0
第1次 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) 后的文件读写指针的位置: 0
第3次把文件读写指针调整到文件头后,
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
>>>
【文章内容结束】