2016-06-29 6 views
0

'www'가있는 것과없는 많은 동등한 URL이 있습니다. 내 csv 파일은 다음과 같습니다파이썬 목록에 삽입하십시오. 항목이 아직 존재하는지 확인하십시오.

www.first.com 
first.com 
www.second.com 
second.com 
www.third.eu 
third.eu 
forth.tr 
fifth.com 
...` 

나는 목록을 반복, IP 주소를 가져와 딕셔너리에 삽입. 중복 된 (www가 포함 된) 항목을 제거하거나 삽입하기 전에 어떻게 확인할 수 있습니까?

내 예상 결과는 다음과 같습니다

[{'entry': ['first.com', '192.168.31.101'}, 
{'entry': ['second.com', '192.168.31.102'}, 
{'entry': ['third.eu', '192.168.31.103'}, 
{'entry': ['forth.tr', '192.168.31.104'}, 
{'entry': ['fifth.com', '192.168.31.105'}] 


with open('myfile.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=' ') 
    result = [] 

    for row in reader: 
     addr = socket.gethostbyname(row[0]) 
     result.append({'entry':[row[0], addr]}) 
+0

그냥 뭔가 명심하십시오 - 일부 호스트는 두 가지 방법으로 요청에 응답하지 않을 수 있습니다. 일부 서버가'www.'없이 도메인에 대한 요청에 응답하지 않는이 문제에 부딪 혔습니다. – sytech

답변

0

가 사전에 있다면 당신은 테스트 할 수 있습니다

url = url.replace("www.","") 
url = url.replace("http://","") 
url = url.split("/")[0] 
if url in my_dict: 
    pass 
else: 
    my_dict[url] = ip_address 
+0

dict 형식을 {Key1 : Value1, Key2 : Value}로 변경할 수 있습니다. 그게 문제가 아니야. 내 문제는 : 'first.com'은 이미 사전에있다. www.first.com이 사전에 삽입되지 않도록하려면 어떻게해야합니까? – saromba

+0

그냥 바꿉니다 ("www.", ""). http : //와 같은 것을 고려하고 싶다면 일련의 대체물에 포함 시키거나 regex를 사용할 수 있습니다. – Jason

1

먼저 수행하여 하나가있는 경우 'www'를 제거 할. 그런 다음 "if address in dict :"를 사용하여 사전에 있는지 확인할 수 있습니다. 즉 :

with open('myfile.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=' ') 
    result = [] 

    for row in reader: 
     addr = socket.gethostbyname(row[0]) 
     if addr[:4] == "www.": 
      addr = addr[4:] 
     add = True 
     for item in result.values(): 
      if addr == item[0]: 
       add = False 
       break 
     if add: 
      result.append({'entry':[row[0], addr]}) 
+0

당신의 시험 'not addr in result'는 항상 True로 평가됩니다. –

+0

나는 그렇게 생각하지 않는다. 사실 addr이 사실이라면 False로 평가해야한다. 내가 놓친 게 있니? – Checkmate

+0

아, 제 사과, 당신 말이 맞아요. 만든 수정! – Checkmate

0

왜 단일 항목을 포함하는 사전 목록이 있습니까? 왜 한 사전 만 쓰지 않는가? 그것은 처음 두 항목과 같을 것이다 :

url_dict = {'first.com':'192.168.31.101', 'second.com':'192.168.31.102'} 

당신은 www가 포함 된 URL이 DICT 이미 있는지 확인하려면 : 결정

if url[:4] == 'www.': 
    if url[4:] in url_dict.keys(): 
     continue 
3

를 사용하여 세트의 경우 IP 주소 전에는 보이지 않았다. 주소를 알 수없는 경우 세트에 추가하고 레코드를 저장하십시오.

'www.'를 제거하십시오. 기본 URL을 저장하려는 경우 url에서 가져옵니다.

adresses = set() 
for row in reader: 
    addr = socket.gethostbyname(row[0]) 
    if addr not in adresses: 
     adresses.add(addr) 
     url = row[0][4:] if row[0].startswith('www.') else row[0] 
     result.append({'entry':[url, addr]}) 
+0

우수한 것입니다. 감사. – saromba

0

지능형리스트를 사용 : (내부 루프는 'www'를 대체 한 번씩 외부의 반복을 반복합니다)

with open('myfile.csv', 'rb') as csvfile: 
     reader = csv.reader(csvfile, delimiter=' ') 
     result = {h: socket.gethostbyname(h) for w in reader (w.replace('www.', '') for w in h) if result and h not in result.keys()} 
0

모든 '항목'키가 어떤 이유가 ?

import csv 
import socket 

with open('myfile.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=' ') 
    entry = {} 

    for row in reader: 
     for url in row: 
      addr = socket.gethostbyname(url) 
      url = url.replace('www.', '') # get rid of www. 
      if not(url in entry): # if key is not already in dict 
       entry[url] = addr 

그리고 당신의 진입 딕셔너리 그런 후 같습니다 :

entry = {'url': 'ip'} 

그런 다음 코드가 될 수있다 :

이 같은 사전이 더 합리적

{'google.com': '173.194.122.240', 'youtube.com': '173.194.73.190'} 
관련 문제