有没有简单的方法查看文件指针所在的行号?
在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
也能做到类似的事情(还有其他一些功能);如果你愿意的话,可以使用这个模块。