有没有简单的方法查看文件指针所在的行号?

13 投票
9 回答
40532 浏览
提问于 2025-04-16 19:40

在Python 2.5中,我正在用文件指针读取一个结构化的文本数据文件(大约30MB大小):

fp = open('myfile.txt', 'r')
line = fp.readline()
# ... many other fp.readline() processing steps, which
# are used in different contexts to read the structures

但是在解析这个文件的时候,我遇到了一些有趣的内容,我想记录下这个内容的行号,这样我就可以在文本编辑器中查看这个文件。我可以用fp.tell()来告诉我当前的字节偏移量(比如16548974L),但没有类似“fp.tell_line_number()”的功能来帮我转换成行号。

有没有Python内置的功能或者扩展,可以轻松地跟踪并告诉我文本文件指针当前在第几行?

注意:我并不是在询问使用line_number += 1这种计数器,因为我在不同的上下文中调用fp.readline(),这种方法需要更多的调试工作,插入计数器到代码的合适位置并不值得。

9 个回答

12

下面的代码会在遍历文件('testfile')时打印出当前指针所在的行号。

file=open("testfile", "r")
for line_no, line in enumerate(file):
    print line_no     # The content of the line is in variable 'line'
file.close()

输出结果:

1
2
3
...
14

你可能会觉得fileinput这个模块很有用。它提供了一种通用的方法,可以让你遍历任意数量的文件。以下是一些文档中的重点内容:

fileinput.lineno()

这个函数会返回刚刚读取的那一行的总行号。在还没有读取第一行之前,它会返回0。在读取完最后一个文件的最后一行后,它会返回那一行的行号。

fileinput.filelineno()

这个函数会返回当前文件中的行号。在还没有读取第一行之前,它会返回0。在读取完最后一个文件的最后一行后,它会返回该行在当前文件中的行号。

18

解决这个问题的一个常见方法是定义一个新类,这个类可以包裹一个已经存在的file实例,这样就可以自动计算数字了。大概是这样的(我只是随便想的,没测试过):

class FileLineWrapper(object):
    def __init__(self, f):
        self.f = f
        self.line = 0
    def close(self):
        return self.f.close()
    def readline(self):
        self.line += 1
        return self.f.readline()
    # to allow using in 'with' statements 
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

使用方法如下:

f = FileLineWrapper(open("myfile.txt", "r"))
f.readline()
print(f.line)

看起来标准模块fileinput也能做到类似的事情(还有其他一些功能);如果你愿意的话,可以使用这个模块。

撰写回答