2016-08-22 53 views
3

进行文本处理通常我会得到使用itertools读取输入文件的每一第二和第四线和使用python

secondline = itertools.islice(input_open, 1, None, 4) 
fourthline = itertools.islice(input_open, 3, None, 4) 

和执行for line in secondlinefor line in fourthline来处理每2号线或四线我的第二和第四线分别。

有没有办法同时处理每条第2和第4条线?我想对每一条第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的比较来得到它们。简单得多,我想获得对“第二”线

+0

我不明白你的问题。一个文件最多有一秒钟,最多四分之一行...因为你知道如何获得它们,你在问什么?你有没有一个文件列表,你必须从所有文件中取出所有的第二行,然后对它们做一些事情,然后做所有的第四行,然后对它们做些什么?还是你有一个文件列表,并为每个文件,你想做的事情与第二和第四行?你可能对['fileinput'](https://docs.python.org/3.5/library/fileinput.html)模块感兴趣,但没有更多的信息,这是不明确的。 – Bakuriu

+0

这是每隔一秒和每四分之一..不是第二和第四行.. – acbh

+1

是不是每隔四行*每隔一行*的子集? – ayhan

回答

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! 

注意,如果最后的“第二”线具有以下,因为该文件太短没有“第四”线,它不会出现在输出。

0

为什么不:

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

使它成为一个发电机

相关问题