读取输入文件的每两行和第四行,并使用python执行文本处理

时间:2016-08-22 18:05:06

标签: python itertools text-processing

通常情况下,我会使用itertools

获取第二和第四行
secondline = itertools.islice(input_open, 1, None, 4)
fourthline = itertools.islice(input_open, 3, None, 4)

并执行for line in secondlinefor line in fourthline分别处理每个第二行或第四行。

有没有办法同时处理每一条第二和第四条线?我想在每个第2行和第4行执行一些文本处理,并在它们之间进行一些数学运算。

UPDATE 我的意思是每第2和第4行:

  line0
  line1  2nd line
  line2   
  line3  4th line
  line4
  line5  2nd line
  line6  
  line7  4th line
  ...

但我想也可以使用enumerate并对i % 4 == 1i % 4 == 3进行比较来获取它们。我认为更简单

2 个答案:

答案 0 :(得分:1)

获得成对“第二”线的一种方法是,“第四”线是仅用islice获取步骤2然后zip获取它自己:

lines = islice(input_file, 1, None, 2)

for second, fourth in zip(lines, lines):

这是有效的,因为zip首先在第一个参数上调用__next__方法,它获取“第二”行并前进迭代器,然后移动到第二个参数并调用__next__再次获得“第四”线并再次推进迭代器。

数字示例:

>>> seq = iter(range(22))
>>> numbers = islice(seq, 1, None, 2)
>>> for num1, num2 in zip(numbers, numbers):
...     print(num1, num2)
... 
1 3
5 7
9 11
13 15
17 19
# Note: missing number 21!

请注意,如果最后一个“第二”行后面没有“第四”行,因为文件太短,它将不会出现在输出中。

答案 1 :(得分:0)

为什么不:

def 2_and_4(fh):
    first = fh.readline()
    second = fh.readline()
    third = fh.readline()
    fourth = fh.readline()
    yield second, fourth

让它成为一个发电机