我有一个列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])
似乎您只是将行
result_mail[line[0]].append(line[1])
放在错误的缩进级别,因此即使if re.match
条件不适用,也会执行它。你知道吗另外,您可能希望使用
collections.defaultdict
来摆脱if line[0] not in result_mail
检查。你知道吗相关问题 更多 >
编程相关推荐