2010-06-10 5 views
0

"IP"라는 IP 주소의 파일이 있습니다. 로그에서 새 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 주소는 자신의 라인에 있습니다. 따라서 :

222.111.222.111 
222.111.222.112 

또한 파일 IP를 배열에 넣으려고했지만 그 행운을 얻지 못했습니다. 아이디어가 있으십니까? 이 IP 일을해야 할 이유는 무엇

게리

+0

이 아마 파이썬 태그를 가져야한다. – liquidleaf

+2

흠,이 문제에 대한 질문은 오해의 소지가 있습니다. 파일 검색을하지 않고 파이썬 파일 액세스에 문제가있는 것 같습니다. –

+0

파일 열기가 'IPs'라는 파일을 찾지 못하는 것처럼 들립니다. 'IPs.txt' 또는 유사하지 않습니까? 당신이 얻는 정확한 오류는 무엇입니까? – fmark

답변

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

이제 목록 (iplist)에 IP를 가지고 당신은 쉽게 당신을 기쁘게 그것을 iplist.append(newip)에 newip을 추가하거나 다른 작업을 수행 할 수 있습니다.


편집 :

파이썬 학습을위한 몇 가지 훌륭한 책 : 당신은 프로그래밍이 어려운 것에 대해 걱정하는 경우 를,이 아이들에 맞있어 책이지만, 나는 솔직히 모두 쉽게 소화 발견 유익한 정보. Snake Wrangling for Kids

파이썬을 배우기위한 또 다른 훌륭한 리소스는 How to Think Like a Computer Scientist입니다.

공식 파이썬 웹 사이트에는 tutorial도 있습니다. 이전에 비해 약간 건조합니다.

[email protected] 메일 링리스트에 가장 많이 기여한 사람 중 한 명인 Alan Gauld는 this tutorial이며 실제로 Python 3에 적합합니다. 비교를 위해 다른 언어도 포함되어 있습니다.

좋은 데드 트리 도서를 원하면 Wesley Chun의 Core Python Programming이 정말 좋은 자료라고 들었습니다. 그는 또한 파이썬 튜터리스트에 자주 기여합니다.

tutor list은 읽고, 회신하며, 자신의 질문을 묻는 또 다른 좋은 곳입니다. 나는 실제로 할 수있는 많은 질문에 대답하려고 노력하면서 대부분의 파이썬을 배웠다. 파이썬을 배우고 싶다면 튜터리스트에 등록하는 것이 좋습니다.

+3

목록 대신 집합을 사용하면 조회가 빨라집니다. – tgray

+0

Wayne, 코드가 필요한 방식으로 작동합니다. 감사합니다. 하지만 나는 포기하고 Bash/grep에 머물러 있다고 생각합니다. 이 python 스크립트가 진행되는 상자는 Python 2.4를 실행하고 있습니다. 이것은 제작 상자입니다. 내 컴퓨터에서 파이썬 2.6.5가 실행 중이다. 관리자는 언제든지 업그레이드 할 계획이 없습니다. 너무 죄송합니다. 전에 언급하지 않았습니다. 중요하지 않다고 생각하지만 그렇지 않습니다. – Gary

+0

아, 네. 적어도'with '를 쓰면 - <2.6 –

1

을 주셔서 감사합니다? 간단한 문자열을 사용하십시오.

!#/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과 친구들에게 더 많은 작업처럼 보입니다.

+0

나는 grep에서 이미이 작업을 수행합니다. 그러나 한 동료는 제가 파이썬을 배우고 파이썬과 같다고 제안했습니다.
코드에 대해 192.168.1.22를 파일 IP에 넣으면이 코드는 "Found 192.168.1.2"라고 표시되므로 "IPy 가져 오기 IP"가 필요한 것입니다. – Gary

+1

실제로 버그가 있지만 수정하기 쉽습니다 :'line.count (ip)'를'line == ip'로 바꾸고 위의 정의를'ip = "192.168.1.2"+ "\ n"' 스트립() 또는 연결을 여러 번 수행하는 것보다 루프 외부에서 한 번 수행하는 것입니다. –

+0

예, 불만족스럽게 고쳐 주셔서 감사합니다. 'count()'는 선행 공백을 무시하기 위해 사용되었습니다. EnTerr의 제안은 IP 이전에 공백이 없을 것이라는 확신이 있다면'+ "\ n"'를 사용하는 것이 좋습니다. 그렇지 않으면 정규 표현식 사용을 고려하십시오. – hudolejev

2

그것은 사소한 코드입니다하지만 난 그것을 짧은 생각하고 꽤 파이썬에서, 그래서 여기에 내가 그것을 쓸 줄 방법은 다음과 같습니다 (

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

그것은, 추가 모드에서 파일을 엽니 다 읽고 발견되지 않는 경우는 그게 else에서 for까지입니다 - 루프가 정상적으로 종료되고 중단없이 종료 된 경우 실행됩니다) - 새 IP를 추가합니다. 따 - ​​다!

많은 IP가있는 경우에는 효과가 없습니다. 내가 생각하기에 또 하나의 해킹이 있는데, 1 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가 양과 시스템 관리자의 자비에 따라 달라집니다.)

+0

훌륭한 아이디어는 별도의 파일로! 65K IP (192.168. *. *)로 테스트되었습니다. 로그 분석은 9414 us 동안 수행되는 반면, 파일 시스템 검사는 50 us (평균 3 테스트, EXT4)가 소요됩니다. 거의 200 배 빠릅니다! upvote 가져 오기 (: – hudolejev