映射emai的重复ID

2024-04-26 21:48:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列ID为MAIL(2000万)的文件:

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来检查email值,但是我得到了一个我不知道如何处理的错误:

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()smth,比如:

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

Tags: incomididsforif电子邮件line
1条回答
网友
1楼 · 发布于 2024-04-26 21:48:46

似乎您只是将行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)

相关问题 更多 >