我是Python(2.6)的新手,有一种情况我需要取消读取我刚从文件中读取的一行。这基本上就是我在做什么。
for line in file:
print line
file.seek(-len(line),1)
zz = file.readline()
print zz
但是我注意到“zz”和“line”不一样。我哪里错了?
感谢。
答案 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.