尝试使用Python改进Shoutcast的日志解析器。
鉴于此日志输入行:
line = "207.86.121.131 207.86.121.131 2012-11-27 13:02:17 /stream?title=Joe%20Bonamassa%20%2D%20I%20Got%20All%20You%20Need 200 iTunes%2F10%2E7%20%28Windows%3B%20Microsoft%20Windows%207%20x64%20Home%20Premium%20Edition%20Service%20Pack%201%20%28Build%207601%29%29%20AppleWebKit%2F536%2E26%2E9 622592 27 184464"
如何提取字段0, 5, 8
?
我的输出应为207.86.121.131 200 27
当我单独尝试line.split()[0]
(或5或8)时,我会得到那个字段,
但如果我尝试line.split()[0,5,8]
,我会收到错误消息
TypeError: list indices must be integers, not tuple
如果我尝试line.split()[[0,5,8]]
,我会收到错误消息
TypeError: list indices must be integers, not list
那么,有没有办法只使用一行.split?
来提取这3个字段答案 0 :(得分:4)
您可以使用itemgetter
。
>>> from operator import itemgetter
>>> itemgetter(0,5,8)(line.split())
('207.86.121.131', '200', '27')
答案 1 :(得分:1)
是的,您必须存储line.split()
返回的列表,然后获取索引:
>>> splitted = line.split()
>>> fields = (x[0], x[5], x[8])
>>> print(fields)
('207.86.121.131', '200', '27')
或者如果你想要一个班轮,你可以使用enumerate()
和列表理解:
>>> fields = [x for i, x in enumerate(line.split()) if i in (0, 5, 8)]
>>> print fields
['207.86.121.131', '200', '27']
答案 2 :(得分:1)
愿你试试这个:
' '.join([x for i, x in enumerate(line.split()) if i in (0, 5, 8)])
结果是:
'207.86.121.131 200 27'