【问题标题】:Python: search and print lines in a file by increments of 2Python:以2为增量搜索和打印文件中的行
【发布时间】:2015-08-27 23:54:02
【问题描述】:

我是新手,所以我希望这不是多余的。假设我有一个名为“mccell”的输入文件,看起来像

     Initial Molecules:                 47
     Initial Molecules:                  1
       1          47
       1           1
       2          48
       2           0
       3          48
       3           0
       4          48
       4           0
       5          48
       5           0
       6          48
       6           0
       7          48
       7           0
       8          48
       8           0
       9          48
       9           0

我试图弄清楚如何以我指定的增量打印特定行。例如,我如何从“Initial Molecule”行开始并仅打印以 2 为增量的行。为了说明我在描述我想要代码做什么:

    Initial Molecules:                 47
    1          47
    2          48
    3          48
    4          48
    5          48
    6          48
    7          48
    8          48
    9           48

我尝试了 readlines() 函数,但无济于事,因为我只能打印整个文件。这是我的错误代码:

    fo = open("mccell")
    lines = fo.readlines()
    print lines

任何帮助或提示将不胜感激。谢谢!

【问题讨论】:

    标签: python file search lines readlines


    【解决方案1】:

    您可以使用range 方法来解决问题。

    fo = open("mccell")
    lines = fo.readlines()
    print lines
    

    遍历行,因为行在 python 中作为列表对象在内部存储,您可以使用从 0 到 len(lines) 的范围,分 2 步

    for i in range(0, len(lines), 2):
        print lines[i]
    

    【讨论】:

    • 如果您要构建lines 列表,只需使用切片即可。 lines[::2] 就是 [lines[i] for i in range(0, len(lines), 2)]
    【解决方案2】:
    print lines[0::2]
    

    从索引 0 开始。每次跳转 2。

    【讨论】:

    • 不过,他没有指定在第一行中找到“Initial Molecules”。
    • 当我尝试这种方法时,它仍然会打印整个文件。有什么想法吗?
    【解决方案3】:

    您可以使用next 内置函数手动推进迭代器。

    with open('mccell') as f:
        alternating = False
        for line in f:
            print(line)
            if "Initial Molecules" in line:
                alternating = True
            if alternating:
                next(f)
                # if we've encountered "Initial Molecules", skip a line
    

    可能更容易阅读(但更慢)遍历列表,找到起始行,然后使用file.seekitertools.islice 再次遍历文件。这也使您可以更轻松地更改增量。

    import itertools
    
    INCREMENT = 2
    
    with open('mccell') as f:
        for line_no, line in enumerate(f):
            if "Initial Molecules" in line:
                start = line_no
                break
        else:
            # there is no "Initial Molecules" in this file, handle it!
        f.seek(0)
        # put file pointer back at the start of the file
        for line in itertools.islice(f, start, None, INCREMENT):
            print(line)
    

    注意我从不使用f.readlines(),所以我从来没有在文件中的所有行的内存中建立一个列表。如果您的文件特别大(或者您的目标机器特别弱),这可能非常重要。同样使用 with 块而不是 fo = open('mccell'); ...; fo.close() 意味着文件在您完成使用后不会保持打开状态,这是一种既定的最佳做法。

    【讨论】:

      【解决方案4】:

      您可以使用计数器来跟踪奇数行和偶数行。

      line_num = 0
      with open('mccell') as f:
        for line in f:
          if line_num % 2 == 0:
             print line
          line_num += 1
      

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 2015-02-05
        • 2014-07-08
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多