2014-01-30 49 views
0

我有列的文件ID MAIL(2000萬):映射重複的ID爲電子郵件

[email protected] 0xE618EF6B90AG 
[email protected] 0xE618EF6B90AF 
[email protected] 0xE618EFBCC83D 
[email protected] 0xE618EFBCC83C 
@000000000 0xE618F02C223E432CEA 
[email protected] 0x01010492A 
[email protected] 0x52107A 
@ 0xE618F032F829432CE04343307C570906A 
[email protected] 0xE618F032F829432CEB 
[email protected] 0xE618F032FE7B432CEC 
[email protected] 0xE618F032FE7B432CED 
@hotmail.com 0x41970588 
@ 0x52087617 

我需要映射ID的註冊電子郵件,所以我們可以找到什麼樣的ID已註冊給定郵件。該電子郵件可能有多個ID在其上註冊。 這裏是我做的功能,但事實證明,我需要排除像@.com@

在腳本的第一個版本,它的工作原理幾乎完全與小東西大多是非有效的電子郵件,我的解析器分解如果電子郵件有符號

所以我之間增加了一個正則表達式來檢查電子郵件值space的地方,但我得到的錯誤,我不知道如何處理:

import re 

def duplicates(filename): 
    with open(filename, 'r') as f: 
     lines = f.readlines() 

    query = (line.replace('\n','') for line in lines) 
    split_query = (line.split(' ') for line in query) 

    result_mail = {} 
    for line in split_query: 
     #added if statement to validate email, remove to check w/o 
     if re.match(r"[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+", line[0]): 
      if line[0] not in result_mail: 
       result_mail[line[0]] = [] 
     result_mail[line[0]].append(line[1]) 

    for mail, ids in result_mail.iteritems(): 
     if len(ids) > 1: 
      with open('MAIL_ids.txt', 'a') as r_mail: 
       r_mail.write(str(mail) + '\n') 
       r_mail.write(str(ids) + '\n') 

if __name__ == '__main__': 
    import sys 
    filename = sys.argv[1] 
    duplicates(filename) 

運行該腳本後我得到關於的錯誤0,這是爲什麼發生?

File ".\dup_1.2.py", line 44, in <module> 
    duplicates(filename) 
File ".\dup_1.2.py", line 32, in duplicates 
    result_mail[line[0]].append(line[1]) 
KeyError: '' 

我也想重寫部分,我添加鍵和值字典。我想用一臺發電機defaultdict()水木清華這樣的:

result_mail = defaultdict(list) 
for line in lines: 
    if line[0] not in result_mail: 
     result_mail[line[0]].append(line[1]) 
+0

好吧!祝你好運! (我在這裏沒有看到任何問題) –

+0

@EmilVikström,好的問題是,如何擺脫KeyError? – izdi

+1

該行是否應該縮進一個級別,放在'if re.match'塊中?此外,你可能想使用'collections.defaultdict' –

回答

1

看來你只是把線result_mail[line[0]].append(line[1])在壓痕錯誤的水平,所以當if re.match情況不適用它甚至被處決。

此外,你可能想要使用collections.defaultdict擺脫if line[0] not in result_mail檢查。

result_mail = collections.defaultdict(list) 
for (id_, mail) in split_query: 
    if re.match(r"[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+", id_): 
     result_mail[id_].append(mail)