如何在python中读取一行

时间:2011-05-01 17:38:42

标签: python file-io

我是Python(2.6)的新手,有一种情况我需要取消读取我刚从文件中读取的一行。这基本上就是我在做什么。

  for line in file:
     print line
     file.seek(-len(line),1)
     zz = file.readline()
     print zz

但是我注意到“zz”和“line”不一样。我哪里错了?

感谢。

4 个答案:

答案 0 :(得分:12)

我认为for line in file:seek不是很好的组合。尝试这样的事情:

while True:
    line = file.readline()
    print line
    file.seek(-len(line),1)
    zz = file.readline()
    print zz

    # Make sure this loop ends somehow

答案 1 :(得分:4)

你根本无法以这种方式混合迭代器和seek()。你应该选择一种方法并坚持下去。

答案 2 :(得分:2)

您可以将线上的迭代与.seek()操作结合起来:

for i, line in enumerate(iter(f.readline, ''), 1):
    print i, line,
    if i == 2: # read 2nd line two times
       f.seek(-len(line), os.SEEK_CUR)

如果文件包含:

a
b
c

然后输出为:

1 a
2 b
3 b
4 c

答案 3 :(得分:1)

未测试。基本上,您希望维护“未读”行的生命缓存。在每次读取一行时,如果缓存中有某些内容,则首先将其从缓存中取出。如果缓存中没有任何内容,请从文件中读取新行。这很粗糙,但应该让你去。

lineCache = []

def pushLine(line):
    lineCache.append(line)

def nextLine(f):
    while True:
        if lineCache:
            yield lineCache.pop(0)
        line = f.readline()
        if not line:
            break
        yield line
    return

f = open('myfile')

for line in nextLine(f):
    # if we need to 'unread' the line, call pushLine on it.  The next call to nextLine will
    # return the that same 'unread' line.
    if some_condition_that_warrants_unreading_a_line:
        pushLine(line)
        continue
    # handle line that was read.