从打开的文件中获取行号python

Posted

技术标签:

【中文标题】从打开的文件中获取行号python【英文标题】:Get line number python from opened file 【发布时间】:2015-05-16 02:27:13 【问题描述】:

我编写了这个 Python 2.7 小原型脚本来尝试从格式化的输入文件中读取指定的行(在此示例中为第 3、4、5 行)。稍后我将从此解析数据并对输入进行操作以构造其他文件。

从系统导入 argv

def comparator (term, inputlist):
    for i in inputlist:
        if (term==i):
            return True
    print "fail"
    return False

readthese = [3,4,5]

for filename in argv[1:]:
    with open(filename) as file:
        for line in file:
            linenum=#some kind of way to get line number from file
            if comparator(linenum, readthese):
                print(line)

我修复了我在脚本中发现的所有错误,但目前我看不到从文件中获取行号。这与从文件对象中提取行号有点不同,因为如果我没记错的话,文件是一个类而不是一个对象。有什么方法可以提取输入文件的行号吗?

我认为我的很多困惑可能源于我对 with 语句所做的事情,所以如果有人也可以解释我对那行代码做了什么,那就太好了。

【问题讨论】:

【参考方案1】:

你可以只 enumerate 文件对象,因为 enumerate 适用于任何可迭代的东西......

for line_number, line in enumerate(file):
    if comparator(line_number, line):
        print line

注意,此索引从 0 开始——如果您希望第一行为 1,只需告诉 enumerate 这是您要开始的位置:

for line_number, line in enumerate(file, 1):
    ...

注意,我建议不要使用名称 file -- 在 python2.x 上,file 是一种类型,因此您实际上是在隐藏一个内置函数(尽管它很少使用...) .

【讨论】:

最初我在另一个 SO 答案中看到了这个“with open”声明,我不确定他是否故意选择使用文件,因为它是一种类型。这确实是我的主要困惑点,学习枚举很有帮助。感谢您的澄清。 啊——我假设另一个答案没有像你这样的上下文管理器?当您执行x = open(...) 时,您会得到与使用上下文管理器时完全相同的xwith open(...) as x:。与后者不同的是,上下文管理器在退出上下文时会执行 close x 的额外工作。【参考方案2】:

您也可以像这样使用列表结构的索引本身:

with open('a_file.txt','r') as f:
    lines = f.readlines()
readthese = [3,4,5]
for lineno in readthese:
    print(lines[1+lineno])

由于lines 的列表已经隐式包含基于索引+1 的行号

如果文件太大而无法保存在内存中,您也可以使用:

readthese = [3,4,5]
f = open('a_file.txt','r')
for lineno in readthese:
    print(f.readline(lineno+1))
f.close()

【讨论】:

以上是关于从打开的文件中获取行号python的主要内容,如果未能解决你的问题,请参考以下文章

Python从导入的模块中获取类的行号

linux常见命令

pythonexcel自动更新行号

如何从 Python 文件句柄打开 .NET FileStream 对象?

获取在 OSX 上的应用程序中打开的文档的名称(python)

[原创]关于设置linux中vim 显示行号