2016-08-22 83 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 

使它成爲一個發電機

相關問題