对于一个file,调用tell()能够知道现在的文件位置,调用seek()可以改变文件指针的位置。
例如:文件中有3行句子,readline后位置就到了第一行的最后,
再readline就到了第二行的最后,此时调用tell()就获得了第二行末尾(换行符'\n')的位置
输出完tell()又使用seek(0),可以使文件位置又回到开头,下次再调用readline就会输出原来第一行的内容了,这应该是很容易理解的。
seek() 和 tell() 用法
seek() 改变文件位置,起始参考是文件头(第一行的第一个字节),单位为字节
tell() 输出当前字节流的位置,单位为字节
file.seek(offset[, whence])
offset : 文件指针的位置
whence : 指出第一个参数offset读取的相对位置,取值为 0, 1, 2
0 - 表示移动到一个绝对位置 (从文件开始算起), 默认seek(0,0) 表示文件头的第一个字符位置
1 - 表示移到一个相对位置 (从当前位置算起)
2 - 表示对于文件尾的一个相对位置,一般用于从后往前读,例如 file.seek(-2,2) 表示读取文件末尾最后两个字符
seek和tell示例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# https://blog.mimvp.com
''' 测试文件 seek() 和 tell() 用法
seek() 改变文件位置,起始参考是文件头(第一行的第一个字节),单位为字节
tell() 输出当前字节流的位置,单位为字节
file.seek(offset[, whence])
offset : 文件指针的位置
whence : 指出第一个参数offset读取的相对位置,取值为 0, 1, 2
0 - 表示移动到一个绝对位置 (从文件开始算起), 默认seek(0,0) 表示文件头的第一个字符位置
1 - 表示移到一个相对位置 (从当前位置算起)
2 - 表示对于文件尾的一个相对位置,一般用于从后往前读,例如 file.seek(-2,2) 表示读取文件末尾最后两个字符
'''
filename = './test.txt'
# 初始化文件,写入三行
def init():
'''
blog
ithomer
com
'''
f = open(filename, 'w')
f.write('blog\n')
f.write('ithomer\n')
f.write('com')
f.close()
def main():
init()
f = open(filename, 'r')
print "输出整个文件内容"
print f.read()
print "\nseek 回到 0"
print("f.tell: " + str(f.tell())) # f.tell: 16
f.seek(0)
f.seek(-2, 2)
print("line 0: " + f.readline()) # line 0: om (读取文件末尾最后两个字符 'om')
print("f.tell_0: %d" % f.tell()) # f.tell_0: 16
f.seek(0)
print("line 1: " + f.readline()) # line 1: blog
print("f.tell_1: %d" % f.tell()) # f.tell_1: 5 (最后一个字符是 '\n')
f.seek(2, 1)
print("line 00: " + f.readline()) # line 00: homer (从上面的当前位置(第二行),跳过两个字符 'it')
print("f.tell_00: %d" % f.tell()) # f.tell_00: 13
f.seek(2) # 等同于 f.seek(2,0), 重新回到了文件头,跳过两个字符
print("line 2: " + f.readline()) # line 2: og (文件位置起始偏移了两个字节,跳过了'bl')
print("f.tell_2: %d" % f.tell()) # f.tell_2: 5
print("line 3: " + f.readline()) # line 3: ithomer
print("f.tell_3: %d" % f.tell()) # f.tell_3: 13 (最后一个字符是 'm',没有'\n')
if __name__ == '__main__':
main()