我们可以在python中使用fread和fwrite将“ip”地址视为字符串吗?

时间:2016-02-20 00:47:21

标签: python csv

我有一个csv格式的服务器日志。它有很多IP地址。我正在编写一个代码,检查每一行是否具有所需的IP,并在IP匹配时将整行复制到新文件。需要对多个IP地址执行此过程。如何在python中获得匹配ip的整行?

fread = open("test1.csv","r")
fwrite = open("test2.csv", 'a')
strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8']
for line in fread:
    if any(s in line for s in strings):
        fwrite.write(line + "")
fwrite.close()
fread.close()

2 个答案:

答案 0 :(得分:0)

代码对我来说很好。

提示:打开python控制台,先用simpel代码尝试(没有读写,所以你知道问题所在:

strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8']
lines =['Whatever without the ip','1.186.8.1 logged on']
for line in lines:
    if any(s in line for s in strings):
        line

我有这个小测试代码的正确输出:

>>> strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8']
>>> lines =['baldie bla','1.186.8.1 logged on']
>>> for line in lines:
...    if any(s in line for s in strings):
...        line
... 
'1.186.8.1 logged on'
>>> 

并使用此:

with open(filenamepath, 'r') as f:
    for line in f:

退出时使用....将自动关闭....

甚至更好,使用单元测试...但我认为这不是你的技能(但在早期阶段要注意,节省了大量时间)TDD(测试驱动开发)

并使用pdb(python调试器)

把它放在代码中:

import pdb; pdb.set_trace()

你可以调试!

你可以输入变量来查看它们是什么......并且用n到下一行,或者q用于退出,s用于进入另一个funstion等等。

答案 1 :(得分:0)

CSV是文本文件,所以是的,您可以将IP地址视为字符串。您演示了虚线IPv4地址表示法,这是表示IP地址的常用方法,但它不是唯一可行的方法。假设您的CSV使用点分表示法,那么您唯一的问题是区分类似的地址,例如1.2.3.4经文11.2.3.4

以下代码使用正则表达式在一行中查找完整的IPv4地址,然后使用set逻辑来识别匹配。

import re

ip4_addr_re = re.compile(r'\d+\.\d+\.\d+\.\d+')

strings = ['1.186.120.149', '1.186.8.1', '1.187.14.3', '99.253.12.8']
ip4_set = set(strings)

with open("test1.csv","r") as fread, open("test2.csv", 'a') as fwrite:
    for line in fread:
        if not ip4_set.isdisjoint(set(ip4_addr_re.findall(line))):
            fwrite.write(line)