我有一个包含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])
答案 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)