2015-05-10 3 views
1

Файл для кода для использования содержит этот бит данных:Как пропустить каждую вторую строку из файла журнала в python?

<188> 2005 Sep 22 11:07:38 (FR114W-52-8f-a8) 66.190.168.225 UDP packet - Source:38.113.146.178,20841,WAN - Destination:66.190.168.225,1026,LAN [Drop] - [Inbound Default rule match] 
#!^ 
<189> 2005 Sep 22 11:07:38 (FR114W-52-8f-a8) 66.190.168.225 Device Receive ICMP Packet - Source:192.168.1.201,[Echo Request],LAN - Destination:192.168.1.1,LAN [Receive] 
#!^ 
<189> 2005 Sep 22 11:07:43 (FR114W-52-8f-a8) 66.190.168.225 Device Receive UDP Packet - Source:10.135.48.1,67,WAN - [Drop] 

код у меня до сих пор является:

import re 
import string 

with open('RouterLogger.log', 'r') as file: 
    for line in file: 
     words = line.split() 
     print words 
     print ("IP ", words[6], 'Time ', words[4]) 

Выход для этого кода заключается в следующем:

['#!^<188>', '2005', 'Sep', '22', '11:07:38', '(FR114W-52-8f-a8)', '66.190.168.225', 'UDP', 'packet', '-', 'Source:38.113.146.178,20841,WAN', '-', 'Destination:66.190.168.225,1026,LAN', '[Drop]', '-', '[Inbound', 'Default', 'rule', 'match]'] 

('IP ', '66.190.168.225', 'Time ', '11:07:38') 

['\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#!^'] 
Traceback (most recent call last): 
    File "/Users/PythonTutorials/print_line_with_match.py", line 10, in <module> 
    print ("IP ", words[6], 'Time ', words[4]) 
IndexError: list index out of range 

Process finished with exit code 1 

Я хотел бы знать, как я могу пропустить каждую вторую строку, чтобы избежать этой ошибки. Я знаю, что каждая другая строка вызывает ошибку, потому что я получаю ошибку Traceback, как только она попадает во вторую строку.

ответ

4

Вы можете пропустить каждую вторую строку в явном виде:

evenline = False 
with open('RouterLogger.log', 'r') as file: 
    for line in file: 
     if not evenline: 
      words = line.split() 
      print words 
      print ("IP ", words[6], 'Time ', words[4]) 
     evenline = not evenline 

Или вы можете (лениво) нарезать его islice:

with open('RouterLogger.log', 'r') as file: 
    for line in itertools.islice(file, 0, None, 2): 
     words = line.split() 
     print words 
     print ("IP ", words[6], 'Time ', words[4]) 

Или вы можете перемещаться по парам линий вместо линий, используя pairwise функция в itertools recipes:

with open('RouterLogger.log', 'r') as file: 
    for first, second in pairwise(file): 
     words = first.split() 
     print words 
     print ("IP ", words[6], 'Time ', words[4]) 

Однако вы абсолютно уверены, что ваш формат «каждая вторая строка»? Если нет, может быть, вы хотите, чтобы пропустить строки, которые начинаются с #:

with open('RouterLogger.log', 'r') as file: 
    for line in file: 
     if not line.startswith('#'): 
      words = line.split() 
      print words 
      print ("IP ", words[6], 'Time ', words[4]) 

... или try каждую строку и пропустить те без достаточного количества слов:

with open('RouterLogger.log', 'r') as file: 
    for line in file: 
     try: 
      words = line.split() 
      print words 
      print ("IP ", words[6], 'Time ', words[4]) 
     except IndexError: 
      pass 
+0

Удивленно, что вы не предложили это - 'open ('log.txt'). readlines() [:: 2]'. Какой крайний случай мне не хватает? – fixxxer

+0

@fixxxer: случай, когда вы не хотите сразу считывать весь файл в память или не хотите просачивать дескриптор файла? – abarnert

+0

1. * лампочка * но насколько большой файл? 2. Как так? – fixxxer

3

Вместо того, пропустив линию во время вашего, цикл вы можете обработать это исключение, изменив код:

import re 
import string 

with open('RouterLogger.log', 'r') as file: 
    for line in file: 
     words = line.split() 
     print words 
     try: 
      print ("IP ", words[6], 'Time ', words[4]) 
     except IndexError: 
      continue 
Смежные вопросы