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])
好吧!祝你好運! (我在這裏沒有看到任何問題) –
@EmilVikström,好的問題是,如何擺脫KeyError? – izdi
該行是否應該縮進一個級別,放在'if re.match'塊中?此外,你可能想使用'collections.defaultdict' –