Python:以2为增量在文件中搜索和打印行

时间:2015-06-12 04:08:09

标签: python file search lines readlines

我是新人,所以我希望这不是多余的。假设我有一个名为" 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

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

4 个答案:

答案 0 :(得分:4)

您可以使用range方法来实现这一目标。

int sump(int * start,int * end)
{
    while(start < end)
    {
        *start = 42;
        start++;
    }
    return 17;
}

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

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

答案 1 :(得分:1)

print lines[0::2]

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可以使用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)

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