映射电子邮件的重复ID

时间:2014-01-30 11:07:59

标签: python regex

我有一个包含ID MAIL(20百万)列的文件:

000000@0000.com 0xE618EF6B90AG
000000@0000.com 0xE618EF6B90AF
00000@00000.com 0xE618EFBCC83D
00000@00000.com 0xE618EFBCC83C
@000000000 0xE618F02C223E432CEA
00000@0000.com 0x01010492A
0000@00000.com 0x52107A
@ 0xE618F032F829432CE04343307C570906A
00000@0000.com 0xE618F032F829432CEB
000000@000.com 0xE618F032FE7B432CEC
000000@000.com 0xE618F032FE7B432CED
@hotmail.com 0x41970588
@ 0x52087617

我需要将已注册的ID映射到电子邮件,以便我们可以找到在给定邮件上注册的ID。电子邮件可能在其上注册了多个ID。 这是我所做的功能,但事实证明我需要排除大多数无效的电子邮件,例如@.com @等。

在脚本的第一个版本中,它几乎完美地用于一个小东西,如果电子邮件在符号之间的某处有space,我的解析器就会崩溃

所以我添加了一个regexp来检查电子邮件值,但是我得到错误我不知道如何处理:

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.-]+@[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)

运行脚本后,我收到有关KeyError ''的错误,为什么会发生这种情况?

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])

1 个答案:

答案 0 :(得分: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.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+", id_):
        result_mail[id_].append(mail)