在文件中查找新IP

时间:2010-06-10 18:10:58

标签: python ironpython ip-address compare

我有一个名为“IP”的IP地址文件。当我从日志中解析新IP时,我想在添加之前查看新IP是否已经在文件IP中。我知道如何将新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()

在“IP”文件中,每个IP地址都在它自己的行上。就这样:

222.111.222.111
222.111.222.112

还尝试将文件IP放入数组中,但也没有好运。 有什么想法吗?

谢谢,

加里

3 个答案:

答案 0 :(得分:3)

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),你可以轻松地将你的新文件添加到它iplist.append(newip)或做任何你喜欢的事情。


编辑:

一些用于学习Python的优秀书籍: 如果你担心编程很困难,有一本专门针对孩子的书,但老实说,我发现这本书既易于理解又能提供丰富的信息。 Snake Wrangling for Kids

学习Python的另一个重要资源是How to Think Like a Computer Scientist

官方Python网站上还有tutorial。与之前相比,它有点干。

Alan Gauld是tutor@python.org邮件列表的最重要贡献者之一,this tutorial非常好,也适用于Python 3.他还包含一些其他语言供比较。

如果你想要一本好的死树书,我听说Wesley Chun的Core Python Programming是一个非常好的资源。他也经常为python导师列表做出贡献。

tutor list是了解python的另一个好地方 - 阅读,回复和提出自己的问题。我实际上通过尝试回答尽可能多的问题来学习我的大部分python。如果你想学习Python,我会认真地推荐订阅导师列表。

答案 1 :(得分:2)

这是一个简单的代码,但我认为它在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()

它以追加模式打开文件,读取并且如果找不到(这是elsefor的作用 - 如果循环正常退出而不是通过中断执行) - 附加新IP。当当!

当你拥有大量IP时,现在效果不佳。这是我想到的另一个黑客,它每1个IP使用1个文件作为标志:

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数量和你的系统管理员的仁慈。)

答案 2 :(得分:1)

为什么你需要这个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和朋友的任务。