2016-06-29 152 views
0

我有許多與「www」相同的URL。 我的CSV文件看起來像這樣:插入python列表。檢查條目是否仍然存在

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

我可以將字典格式更改爲{Key1:Value1,Key2:Value}。那不是問題.. 我的問題是: 'first.com'已經在字典中。 如何防止www.first.com插入字典中? – saromba

+0

只要替換(「www。」,「」)。如果你想要解釋像http://這樣的東西,你可以將它包含在一系列替換中,也可以使用正則表達式。 – 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

我不這麼認爲;它應該只評估爲False,如果addr實際上已經在結果中,我相信這是重點。我錯過了什麼嗎? – Checkmate

+0

啊,我的歉意,你是對的。編輯製作! – Checkmate

0

爲什麼你有一個包含單個項目的字典列表?爲什麼不使用一本字典?它看起來像這樣與前兩個條目:

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

如果你想檢查是否含有WWW網址已經在字典:

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

使用一組以確定是否有IP地址以前沒有見過。如果地址未知,請將其添加到設置並存儲該記錄。

並剝離'www。'從網址,如果你想存儲基地的網址。

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

是否有任何理由讓所有的「進入」鍵?

這是比較合理的有這樣的詞典:

entry = {'url': 'ip'} 

那麼你的代碼可能是:

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 

而且你進入字典照顧,像:

{'google.com': '173.194.122.240', 'youtube.com': '173.194.73.190'} 
相關問題