迭代在文件中的行上时循环?

时间:2015-01-12 01:15:41

标签: python file

我有一个循环如下:

for line in FILE:
    if ('MyExpression' in line)
        # Pull the first number out of this line and put it in a list
        # Pull the first number out of the NEXT line that has either 'MyExpression' or      'MyExpression2', and put it in a list

基本上,我想在'My Expression exists'找到一行,并从该行中抽出一个数字,表示试验的开始。然后我想跳转到包含MyExpressionMyExpression2的下一行,并从该行中提取一个数字,这是我的试验的偏移量。我想浏览整个文件,所以我有两个列表,一个表示开始,一个表示偏移。

我知道如何在Matlab中做到这一点,但在Python中,我不知道如何告诉它在下一行中查看。喜欢if(' MyExpresion' in line + 1)OR(' MyExpression2' in line + 1)?

更新:对于迟到的回复感到抱歉,但这就是我的文件的样子:

1234 MyExpression Blah Blah
3452 Irrelevant Blah Blah
4675 MyExpression2 Blah Blah
5234 MyExpression Blah Blah
6666 MyExpression Blah Blah

我想要两个数组/列表:[1234,5234]和[4675,6666]基本上,它们对应于开始和偏移。我将使用当前的答案,看看他们是否有人这样做,谢谢!

3 个答案:

答案 0 :(得分:4)

文件对象为iterators,这意味着您可以使用next推进它们:

for line in FILE:
    if ('MyExpression' in line):
        next_line = next(FILE, None)

请注意,如果到达文件末尾,则None会返回默认值。没有它,将引发StopIteration例外。

答案 1 :(得分:4)

for line in afile:循环的正文中,下一行尚未阅读;但是,您可以继续读取所述循环体内的以下行。 E.g:

for line in afile:
    if 'MyExpression' in line:
        # ...the number extraction, e.g with a regular expression, then:
        for nextline in afile:
            if 'MyExpression' in nextline or 'MyExpression2' in nextline:
                # the other number extraction, then
                break  # done with the inner loop

请注意consumes afileitertools.tee部分(或全部)内容的afile。如果您需要再次遍历该部分,则需要使用a.txt制作两个"克隆" 1234 MyExpression Blah Blah 3452 Irrelevant Blah Blah 4675 MyExpression2 Blah Blah 5234 MyExpression Blah Blah 6666 MyExpression Blah Blah 迭代器的循环,以及"克隆"代替。但是,根据我对你的问题的理解,这对你的具体要求来说并不是必需的(而且它有点棘手,所以我不会对此进行阐述)。

例如,如果with open('a.txt') as afile: results = [] for line in afile: if 'MyExpression' in line: first = int(line.split()[0]) for nextline in afile: if 'MyExpression' in nextline or 'MyExpression2' in nextline: second = int(nextline.split()[0]) results.append([first, second]) break # done with the inner loop print(results) 是您提供的示例文件:

[[1234, 4675], [5234, 6666]]

然后这个示例代码:

[1234, 5234] and [4675, 6666]

发射

4675

不知道你想象的算法是什么,而是

{{1}}

什么逻辑规范会使{{1}}被忽略为第一对但重新考虑为开始第二对?当然,我在Q的文本中没有看到任何内容,因此,请编辑该文本以使您的规格符合您的实际意图!

答案 2 :(得分:0)

希望这有助于...寻找“表情”,并成对打印线条。

text = "Expression"

# Get lines with text in it
with open('test.log') as log_file:
    the_lines = [line.strip() for line in log_file if text in line]

# Make pairs (0,1), (2,3), etc.
duples = [(the_lines[2*i], the_lines[2*i+1]) for i in xrange(len(the_lines)/2)]

# Show me...
for pair in duples:
    print pair

您应该将line.strip()替换为您自己的函数,以获取您要查找的数字。

注意:我不喜欢在创建双工时使用索引,但它比使用迭代器更简单。