代码之家  ›  专栏  ›  技术社区  ›  MikeN

Python:撤消file readline()操作,使文件指针返回原始状态

  •  30
  • MikeN  · 技术社区  · 14 年前

    我该如何从本质上撤销一个file.readline()对文件指针的操作?

    5 回复  |  直到 4 年前
        1
  •  56
  •   D.Shawley    14 年前

    你必须打电话来记住位置 file.tell() file.seek()

    fp = open('myfile')
    last_pos = fp.tell()
    line = fp.readline()
    while line != '':
      if line == 'SPECIAL':
        fp.seek(last_pos)
        other_function(fp)
        break
      last_pos = fp.tell()
      line = fp.readline()
    

    我想不起来打电话是否安全 file.seek() 内部 for line in file 所以我通常只写下 while 循环。可能有一种更为蟒蛇式的方法。

        2
  •  13
  •   Alex Martelli    14 年前

    您可以用 thefile.tell() 在你打电话之前 readline ,如果需要的话,回到这一点上 thefile.seek

    >>> with open('bah.txt', 'w') as f:
    ...   f.writelines('Hello %s\n' % i for i in range(5))
    ... 
    >>> with open('bah.txt') as f:
    ...   f.readline()
    ...   x = f.tell()
    ...   f.readline()
    ...   f.seek(x)
    ...   f.readline()
    ... 
    'Hello 0\n'
    'Hello 1\n'
    'Hello 1\n'
    >>> 
    

    读线

        3
  •  5
  •   unutbu    14 年前

    如果您的方法只是想遍历文件,那么您可以使用 itertools.chain

    import itertools
    
    def process(it):
        for line in it:
            print line,
    
    with open(filename,'r') as f:
        for line in f:
            if 'marker' in line:
                it=itertools.chain((line,),f)
                process(it)
                break
    
        4
  •  1
  •   GWW    14 年前
    fin = open('myfile')
    for l in fin:
        if l == 'myspecialline':
            # Move the pointer back to the beginning of this line
            fin.seek(fin.tell() - len(l))
            break
    # now fin points to the start of your special line
    
        5
  •  0
  •   JLT    6 年前

    如果您不知道最后一行,因为您没有访问它,您可以向后阅读,直到您看到一个换行符:

    with open(logfile, 'r') as f:
        # go to EOF
        f.seek(0, os.SEEK_END)
        nlines = f.tell()
        i=0
        while True:
            f.seek(nlines-i)
            char = f.read(1)
            if char=='\n':
                break
            i+=1
    
    推荐文章