Skip to main content
 首页 » 编程设计

python之如何从 python 中的日志文件中跳过每一行

2025年05月04日13虾米姐

要使用的代码文件包含以下数据:

<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 错误。

请您参考如下方法:

你可以明确地跳过每一行:

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]) 

或者您可以使用 itertools recipes 中的 pairwise 函数迭代成对的线而不是线。 :

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]) 

… 或尝试每一行并跳过没有足够单词的行:

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