如何在python中获取当前打开的文件行?

如何在python中获取当前打开的文件行?,python,file,seek,line-count,Python,File,Seek,Line Count,假设您打开一个文件,并在文件中的某个位置执行seek(),您如何知道当前文件行 (我个人用一个特殊的文件类解决了这个问题,该类在扫描文件后将seek位置映射到行,但我希望看到其他提示,并将这个问题添加到stackoverflow中,因为我无法在google的任何地方找到这个问题)以下是我将如何处理这个问题,使用尽可能多的惰性: from random import randint from itertools import takewhile, islice file = "/etc/pass

假设您打开一个文件,并在文件中的某个位置执行seek(),您如何知道当前文件行


(我个人用一个特殊的文件类解决了这个问题,该类在扫描文件后将seek位置映射到行,但我希望看到其他提示,并将这个问题添加到stackoverflow中,因为我无法在google的任何地方找到这个问题)

以下是我将如何处理这个问题,使用尽可能多的惰性:

from random import randint
from itertools import takewhile, islice

file = "/etc/passwd"
f = open(file, "r")

f.seek(randint(10,250))
pos = f.tell()

print "pos=%d" % pos

def countbytes(iterable):
    bytes = 0
    for item in iterable:
        bytes += len(item)
        yield bytes

print 1+len(list(takewhile(lambda x: x <= pos, countbytes(open(file, "r")))))
使用seek()时,python将使用指针偏移量跳转到文件中所需的位置。但是为了知道当前行号,你必须检查每个字符直到那个位置。因此,您最好放弃seek()而选择read():

替换

f = open(filename, "r")
f.seek(55)

也许您不希望使用f.read(num),因为如果num非常大,这可能需要大量内存。在这种情况下,您可以使用如下生成器:

import itertools
import operator
line_number=reduce(operator.add,( f.read(1)=='\n' for _ in itertools.repeat(None,num)))
pos=f.tell()

这相当于
f.seek(num)
,还有一个额外的好处,就是给你
行号

我实际上在这里的某个地方发布了这个类,所以。。。不知道位置。如果要查找字节偏移量,如果不计算在该位置之前遇到的\n个字符,则无法知道行。至于什么是使用文件最有效的方法,我不确定。。。。祝你好运是的。也许有图书馆提供这种服务。正如我所说的,我自己实现了它,但如果可能的话,我更愿意将此任务委托给外部库。@Stefano-你在找什么?
f = open(filename, "r")
line=f.read(55).count('\n')+1
print(line)
import itertools
import operator
line_number=reduce(operator.add,( f.read(1)=='\n' for _ in itertools.repeat(None,num)))
pos=f.tell()