2010-06-10 20 views
0

J'ai un fichier d'adresses IP appelé "IPs". Lorsque j'analyse une nouvelle adresse IP à partir de mes journaux, j'aimerais voir si la nouvelle adresse IP est déjà dans les adresses IP du fichier, avant de l'ajouter. Je sais comment ajouter la nouvelle adresse IP au fichier, mais j'ai du mal à voir si la nouvelle adresse IP est déjà dans le fichier.Recherche d'une nouvelle adresse IP dans un fichier

!/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() 

Dans le fichier "IPs", chaque adresse IP est sur sa propre ligne. En tant que tel:

222.111.222.111 
222.111.222.112 

Également essayé de mettre le fichier IP dans un tableau, mais ne pas avoir de la chance avec ça non plus. Des idées?

Merci,

Gary

+0

Cela devrait probablement avoir une balise Python. – liquidleaf

+2

Hmmm, la question à ce problème est trompeuse, vous semblez avoir des problèmes avec l'accès aux fichiers Python, pas avec une recherche de fichier –

+0

Il semble que le fichier ouvert ne trouve pas le fichier appelé IPs - êtes-vous sûr de son pas 'IPs.txt' ou similaire? Quelle est l'erreur exacte que vous obtenez? – fmark

Répondre

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') 

Maintenant vous avez vos adresses IP dans une liste (iplist) et vous pouvez facilement ajouter votre newip à ce iplist.append(newip) ou quoi que ce soit d'autre que vous s'il vous plaît.


Edit:

Quelques excellents livres pour apprendre Python: Si vous êtes inquiet sur la programmation étant difficile, il y a un livre qui est orienté vers les enfants, mais honnêtement, je trouve à la fois facile à digérer et informatif. Snake Wrangling for Kids

Une autre excellente ressource pour apprendre Python est How to Think Like a Computer Scientist.

Il y a aussi le tutorial sur le site officiel de Python. C'est un peu sec par rapport aux précédents.

Alan Gauld, l'un des principaux contributeurs à la liste de diffusion [email protected] a this tutorial qui est vraiment bon et est également adapté à Python 3. Il comprend également d'autres langages de comparaison.

Si vous voulez un bon livre Dead Tree, j'ai entendu dire que Core Python Programming par Wesley Chun est une très bonne ressource. Il contribue aussi à la liste des tuteurs python de temps en temps.

Le tutor list est un autre bon endroit pour apprendre sur python - lire, répondre et poser vos propres questions. En fait, j'ai appris la plupart de mon python en essayant de répondre à autant de questions que je pouvais. Je vous recommande sérieusement de vous abonner à la liste des tuteurs si vous voulez apprendre Python.

+3

L'utilisation d'un ensemble au lieu d'une liste rendrait les recherches plus rapides. – tgray

+0

Wayne, Votre code fonctionne comme j'avais besoin, alors MERCI !!! Mais je pense que j'abandonne et reste avec Bash/grep. La boîte sur laquelle ce script Python fonctionne exécute Python 2.4, c'est une boîte de production. Mon ordinateur exécute Python 2.6.5. L'administrateur n'a pas l'intention de mettre à jour de sitôt. SO SORRY Je n'ai pas mentionné cela auparavant, je ne pensais pas que cela avait de l'importance, mais c'est le cas. – Gary

+0

Ah, oui. Au moins si vous utilisez 'with' - je vais mettre en place le code similaire pour <2.6 –

1

Pourquoi avez-vous besoin de cette chose IP? Utilisez des chaînes simples.

!#/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() 

En plus, cela ressemble plus à une tâche pour grep et les amis.

+0

Je l'ai déjà fait dans grep et ça marche. Mais un collègue m'a suggéré d'apprendre Python et je suis comme python. A propos de votre code, si vous mettez 192.168.1.22 dans les fichiers IP, ce code dit "Found 192.168.1.2", et c'est pourquoi vous avez besoin de la chose "from IPy import IP". – Gary

+1

il y a un bug en effet mais c'est facile à corriger: remplacer 'line.count (ip)' par 'line == ip' et changer la définition ci-dessus par' ip = "192.168.1.2" + "\ n" '(mieux faire cela une fois en dehors de la boucle que faire strip() ou concaténation plusieurs fois à l'intérieur) –

+0

Oui, mon mauvais, merci pour la fixation. 'count()' a été utilisé pour ignorer les espaces de début, le cas échéant. La suggestion d'EnTerr avec '+" \ n "' est la bonne façon de procéder si vous êtes sûr qu'il n'y aura pas d'espace avant IPs. Sinon, envisagez d'utiliser des expressions régulières. – hudolejev

2

Il est un code trivial mais je pense qu'il est court et joli en Python, alors voici comment je l'écrire:

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() 

Il ouvre le fichier en mode append, lit et si non trouvé (c'est ce que fait else à un for - s'exécute si la boucle s'est terminée normalement et non par rupture) - ajoute la nouvelle adresse IP. ta-da!

Maintenant, sera inefficace lorsque vous avez beaucoup d'adresses IP. Voici une autre astuce que je pensais, il utilise 1 fichier par 1 IP comme un drapeau:

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() 

Pourquoi est-ce rapide? Parce que la plupart des systèmes de fichiers de nos jours (sauf FAT sous Windows mais NTFS est correct) organisent la liste des fichiers dans un répertoire dans une structure B-tree, donc vérifier l'existence d'un fichier est une opération rapide O (log N) liste.

(je ne dis pas cela est pratique - dépend de la quantité d'adresses IP que vous attendez de voir et votre bienveillance sysadmin.)

+0

Super idée avec des fichiers séparés! Juste testé avec IP 65K (192.168. *. *). L'analyse du journal est effectuée pour 9414 us, alors que la vérification du système de fichiers prend 50 us (moyenne de 3 tests, EXT4). Près de 200 fois plus vite! Récupérer un upvote (: – hudolejev