2017-10-24 34 views
0

私のコードは、テキストファイルからIPアドレスを地理的に見つけ出すように設計されています。私は最後のセクションで問題を抱えています。私は、コードを実行すると、私はmap_ip.updateラインからの苦情を取得する:私は読むためにcountry_name_by_addr()を取得するにはどうすればよいPython:文字列のリストとしてIPアドレスのリストを渡す

['$ ip address'] 
['$ ip address'] 
['$ ip address'] 

:私はprint文でトラブルシューティングを行うときsocket.error: illegal IP address string passed to inet_pton

は、私は次の形式を取得します適切な形式の各IPアドレス?私のIPアドレスは、個々のリストの文字列のリストとしてフォーマットされているようです。

# script that geo-locates IP addresses from a consolidated dictionary 

    import pygeoip 
    import itertools 
    import re 

    # initialize dictionary for IP addresses 
    count = {} 

    """ 
    This loop reads text file line-by-line and 
    returns one-to-one key:value pairs of IP addresses. 
    """ 
    with open('$short_logins.txt path') as f: 
     for cnt, line in enumerate(f): 
     ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', line) 
     count.update({cnt: ip}) 
     cnt += 1 

    """ 
    This line consolidates unique IP addresses. Keys represent how 
    many times each unique IP address occurs in the text file. 
    """ 
    con_count = [(k, len(list(v))) for k, v in itertools.groupby(sorted(count.values)))]  


    """ 
    Country lookup: 
    This section passes each unique IP address from con_count 
    through country name database. These IP address are not required 
    to come from con_count. 
    """ 
    map_ip = {} 
    gi = pygeoip.GeoIP('$GeoIP.dat path') 

    for i in count.itervalues(): 
     map_ip.update({i: gi.country_name_by_addr(i)}) 

    print map_ip 

答えて

0

だから私は正規表現を離れて行うことで、昨日、このジレンマを解決:私は、ファイル内の空白を除去し、IPアドレスがいたかどうかを確認するためにチェックすることによって、はるかに簡単な解決策を見つけた

ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', line) 

を占めた。 IPアドレスはすべて第3列にあるので、[2]:

ip = line.split()[2] 
if ip in count: 
    count[ip] += 1 
else: 
    count.update({ip: 1}) 

私はcon_count行も削除しました。 Pygeoipの関数は、正規表現で作られていないリストをはるかに受け入れます。

関連する問題