如何使用python编程获取文件中的特定行数?

时间:2016-09-06 05:13:30

标签: python file

这是我每次获取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

2 个答案:

答案 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)和字节级输入(tellseekread)。由于低级OS系统调用只能读取字节数,readline实际上读取缓冲区并在其中搜索换行符。但是tell给出的文件指针位于缓冲区的末尾,而不是位于该行的末尾。

除了通过一次处理一个字符并手动检测行尾之外,无法在行尾设置文件指针。