Python 2.7处理line.split()索引越界问题求助
解决
IndexError: list index out of range问题(处理iptables日志行缺失最后一列的情况) Hey Romain, 这个问题很常见——你遇到的IndexError确实是因为部分iptables规则行拆分后没有第11个元素(索引从0开始,[10]对应第11个位置)。有些规则行带有额外的匹配条件(比如示例里的tcp dpt:53或ctstate RELATED,ESTABLISHED),而有些没有,直接硬编码索引就会报错。下面给你几种实用的修改方案:
方案1:先拆分存变量,判断长度后赋值
这种方式清晰直观,还能避免多次调用line.split()浪费性能:
elif line[0].isdigit(): parts = line.split() chain['num']=parts[0] chain['pkts']=parts[1] chain['bytes']=parts[2] chain['target']=parts[3] chain['prot']=parts[4] chain['opt']=parts[5] chain['in']=parts[6] chain['out']=parts[7] chain['source']=parts[8] chain['destination']=parts[9] # 检查是否有第10个索引的元素,没有就赋空字符串或None if len(parts) > 10: chain['xxx'] = parts[10] else: chain['xxx'] = '' # 或者改成 None,根据你的需求选择
方案2:用try-except捕获异常
如果不想写长度判断,也可以直接捕获索引越界的异常,给缺失字段赋默认值:
elif line[0].isdigit(): chain['num']=line.split()[0] chain['pkts']=line.split()[1] chain['bytes']=line.split()[2] chain['target']=line.split()[3] chain['prot']=line.split()[4] chain['opt']=line.split()[5] chain['in']=line.split()[6] chain['out']=line.split()[7] chain['source']=line.split()[8] chain['destination']=line.split()[9] try: chain['xxx']=line.split()[10] except IndexError: chain['xxx'] = '' # 或 None
完整修改后的create_chain函数示例
推荐用方案1,因为多次调用line.split()没必要,存成parts变量更高效:
def create_chain(chain_segment): chains=[] chain_lines = [line for line in chain_segment.split('\n') if line] for line in chain_lines: chain={} if word in line: chain['type'] = line.split()[1] elif line[0].isdigit(): parts = line.split() chain['num']=parts[0] chain['pkts']=parts[1] chain['bytes']=parts[2] chain['target']=parts[3] chain['prot']=parts[4] chain['opt']=parts[5] chain['in']=parts[6] chain['out']=parts[7] chain['source']=parts[8] chain['destination']=parts[9] chain['xxx'] = parts[10] if len(parts) > 10 else '' chains.append(chain) chains=filter(None, chains) chains=list(chains) chained = [merge_dicts(chains[0], i) for i in chains[1:]] return chained
这样修改后,代码遇到没有最后一列的行时,会自动给xxx字段赋空字符串,不会再抛出索引越界的异常,完美适配你的iptables日志格式。
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

