这是我每次获取20行的代码,但f1.tell()给出了文件的最后位置。所以我下次不能获得20行。 任何人都可以帮我这样做吗?请
f1=open("sample.txt","r")
last_pos=0
while true:
f1.seek(last_pos)
for line,i in enumerate(f1.readlines()):
if line == 20:
last_pos=f1.tell()
break
else:
print i
sample.txt file contains below data
1
2
3
4
.
.
.
.
40
I want Output like
1
2
3
4
.
.
.
20
20
21
22
23
24
25
.
.
.
.
39
39
40
答案 0 :(得分:1)
使用readlines
读取所有文件:您到达目的地,因此您正在体验。
使用带有readline
的循环可以正常工作,并为您提供第20行结束的位置(而不是21世纪的开始)
代码(我删除了无限循环BTW):
f1=open("sample.txt","r")
last_pos=0
line=0
while True:
l=f1.readline()
if l=="":
break
line+=1
if line == 20:
last_pos=f1.tell()
print(last_pos)
break
f1.close()
您可以使用for i,l in enumerate(f1):
迭代,但迭代器和& ftell不兼容(你得到:OSError: telling position disabled by next() call
)。
然后,寻找一个给定的位置,只需f1.seek(last_pos)
编辑:如果你需要打印两行甚至20行,你实际上甚至不需要seek
,只需在计算20行时打印最后一行。
但如果你真的想这样做,就是这样:
f1=open("sample.txt","r")
line=0
rew=False
while True:
start_line_pos=f1.tell()
l=f1.readline()
if l=="":
break
print(l.strip())
line+=1
if rew:
rew = False # avoid re-printing the 20th line again and again
elif line % 20 == 0:
f1.seek(start_line_pos)
rew = True
line-=1 # pre-correct line counter
f1.close()
你注意到了一些逻辑,以避免卡在第20行。它工作正常:当到达第20,40行......时,它会回到先前存储的文件位置并再次读取1行。 rew
标志可以防止多次执行此操作。
答案 1 :(得分:0)
Jean-FrançoisFabre已经解释过readline
可以读取整个文件。
但无论如何,你绝不应该混合行级输入(readline
)和字节级输入(tell
,seek
或read
)。由于低级OS系统调用只能读取字节数,readline
实际上读取缓冲区并在其中搜索换行符。但是tell
给出的文件指针位于缓冲区的末尾,而不是位于该行的末尾。
除了通过一次处理一个字符并手动检测行尾之外,无法在行尾设置文件指针。