在文件中查找新IP
我有一个叫做“IPs”的文件,里面存放着一些IP地址。当我从日志中解析出一个新的IP时,我想先检查一下这个新IP是否已经在“IPs”文件里,如果没有再添加进去。我知道怎么把新的IP添加到文件里,但我在检查新IP是否已经存在时遇到了困难。
!/usr/bin/python
from IPy import IP
IP = IP('192.168.1.2')
#f=open(IP('IPs', 'r')) #This line doesn't work
f=open('IPs', 'r') # this one doesn't work
for line in f:
if IP == line:
print "Found " +IP +" before"
f.close()
在“IPs”文件中,每个IP地址都是单独一行。就像这样:
222.111.222.111
222.111.222.112
我也试着把“IPs”文件里的内容放到一个数组里,但也没有成功。有没有什么好的建议呢?
谢谢,
加里
3 个回答
为什么需要这个IP的东西?用简单的字符串就行了。
!#/usr/bin/env python
ip = "192.168.1.2" + "\n" ### Fixed -- see comments
f = open('IPs', 'r')
for line in f:
if line.count(ip):
print "Found " + ip
f.close()
而且,这看起来更像是一个可以用grep
等工具来处理的任务。
这段代码看起来简单,但我觉得在Python中写得简洁又漂亮,所以我会这样写:
ip = '192.168.1.2'
lookFor = ip + '\n'
f = open('ips.txt', 'a+')
for line in f:
if line == lookFor:
print 'found', ip, 'before.'
break
else:
print ip, 'not found, adding to file.'
print >>f, ip
f.close()
它以追加模式打开文件,读取内容,如果没有找到(这就是for
后面跟else
的意思——正常结束循环时执行,而不是通过break
退出)——就会添加新的IP。就这样!
不过,当你有很多IP时,这个方法就不太有效了。我想到了另一个小窍门,它是为每个IP使用一个文件作为标记:
import os
ip = '192.168.1.2'
fname = ip + '.ip'
if os.access(fname, os.F_OK):
print 'found', ip, 'before.'
else:
print ip, 'not found, registering.'
open(fname, 'w').close()
为什么这样会快呢?因为现在大多数文件系统(除了Windows上的FAT,NTFS是可以的)会把目录里的文件列表组织成一种叫做B树的结构,所以检查一个文件是否存在的操作是很快的,复杂度是O(log N),而不是遍历整个列表。
(我并不是说这个方法实用——这取决于你预期会有多少个IP,以及你的系统管理员的态度。)
iplist = []
# With takes care of all the fun file handling stuff (closing, etc.)
with open('ips.txt', 'r') as f:
for line in f:
iplist.append(line.strip()) # Gets rid of the newlines at the end
# Change the above to this for Python versions < 2.6
f = open('ips.txt', 'r')
for line in f:
iplist.append(line.strip())
f.close()
newip = '192.168.1.2'
if newip not in iplist:
f = open('ips.txt', 'a') # append mode, please
f.write(newip+'\n')
现在你有一个包含IP地址的列表(iplist),你可以很简单地把新的IP地址加进去,方法是用 iplist.append(newip)
,或者你可以随意做其他操作。
补充:
如果你想学习Python,这里有一些很棒的书籍推荐:如果你担心编程很难,有一本书是专门为孩子们写的,但我觉得它既容易理解又很有用。你可以看看 《给孩子的蛇编程书》。
另一个学习Python的好资源是 《如何像计算机科学家一样思考》。
还有官方Python网站上的 教程,虽然相比前面提到的书籍,它的内容稍微有点枯燥。
Alan Gauld是tutor@python.org邮件列表的主要贡献者之一,他有一个很不错的 教程,而且是针对Python 3的。他还包括了一些其他语言的对比。
如果你想要一本好的纸质书,我听说 《核心Python编程》,作者是Wesley Chun,是一个非常好的资源。他也时不时会在Python导师列表中贡献一些内容。
导师列表也是学习Python的好地方,你可以阅读、回复和提问。我实际上是通过尽量回答很多问题来学会大部分Python的。如果你想学Python,我真的建议你订阅这个导师列表。