对于一个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()