列表解析,就地循环,十六进制转换

时间:2014-05-06 21:25:57

标签: python python-2.7

第一天使用python和新编码器,非常感谢一些帮助,我有一个日志文件

End:   1398789531:    934328  6 V       160.0.0.9:18299
End:   1398789535:    938994  6 V       160.0.0.7:14586
End:   1398789540:    944668  6 V       160.0.0.9:36690

我想提取IP地址,剥离端口并将IP转换为十六进制以便进一步处理,到目前为止我只有这个工作

with open('myfile') as infile:
for line in infile:
    print(line.split()[5])

result =

160.0.0.9:18299
160.0.0.7:14586
160.0.0.9:36690

任何人都可以向我展示一个优雅的解决方案,用于将端口剥离端,然后将它们转换为十六进制...

欢呼声

2 个答案:

答案 0 :(得分:1)

如果您的文件是myfile:

End:   1398789531:    934328  6 V       160.0.0.9:18299
End:   1398789535:    938994  6 V       160.0.0.7:14586
End:   1398789540:    944668  6 V       160.0.0.9:36690

下一段代码:

with open("myfile", 'r') as file:
for line in file:
    ip_addr_hex = map(hex, map(int, list(line.split()[-1].split(':')[0].split('.'))))
    print(ip_addr_hex)

将生成输出波纹管,即每个IP的十六进制数:

['0xa0', '0x0', '0x0', '0x9']
['0xa0', '0x0', '0x0', '0x7']
['0xa0', '0x0', '0x0', '0x9']

以下代码:

with open("myfile", 'r') as file:
for line in file:
    ip_addr_hex = '.'.join(map(hex, map(int, list(line.split()[-1].split(':')[0].split('.')))))
    print(ip_addr_hex)

将产生此输出:

 0xa0.0x0.0x0.0x9
 0xa0.0x0.0x0.0x7
 0xa0.0x0.0x0.0x9

您可以根据所需的输出选择代码。 你需要从这里得到的是“循环到位”,它利用了“地图”功能。一般用途是map(func,list)。

您必须阅读 inside - >中的声明退出。首先,line.split [-1]捕获该行的最后一个元素(-1)。接下来,.split(':')[0]捕获由':'分隔的字符串的第一个元素,这是您的IP。第三,.split('。'),划分IP的元素。 list()将整个字符串转换为一个列表,这样你就可以同时在每个元素上应用map函数,这些字符串就是这一点。在这种情况下,应用的第一个函数是map(int,list(...))。这将整数转换为所有字符串。现在,你有一个整数列表,你再次应用map函数map(hex,....)来转换十六进制值中的所有整数。这有道理吗?从这里得到的要点是你必须从里面阅读整个陈述 - >进行。

答案 1 :(得分:0)

with open('myfile') as infile:
for line in infile:
    ip = line.split()[5].split(':')[0].split('.')
    hex = ''
    for i in ip:
       hex += hex(int(i))
    print hex