【问题标题】:Get line number python from opened file从打开的文件中获取行号python
【发布时间】: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 语句所做的事情,所以如果有人也可以解释我对那行代码做了什么,那就太好了。

【问题讨论】:

    标签: python parsing with-statement


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2019-11-08
      相关资源
      最近更新 更多