我有一个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()
答案 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)