所以,我只是想制作一个简单的脚本,可以过滤不同域的电子邮件,它的工作很好,但我需要一个快捷方式,因为我不会写if if和elif语句很多时间,任何人都可以告诉我如何编写我的脚本与功能,以便变得更短更容易..提前感谢,脚本在下面:
f_location = 'C:/Users/Jack The Reaper/Desktop/mix.txt'
text = open(f_location)
good = open('C:/Users/Jack The Reaper/Desktop/good.txt','w')
for line in text:
if '@yahoo' in line:
yahoo = None
elif '@gmail' in line:
gmail = None
elif '@yahoo' in line:
yahoo = None
elif '@live' in line:
live = None
elif '@outlook' in line:
outlook = None
elif '@hotmail' in line:
hotmail = None
elif '@aol' in line:
aol = None
else:
if ' ' in line:
good.write(line.strip(' '))
elif '' in line:
good.write(line.strip(''))
else:
good.write(line)
text.close()
good.close()
答案 0 :(得分:2)
我建议您使用dict
代替所有案例的单独变量。
my_dict = {}
...
if '@yahoo' in line:
my_dict['yahoo'] = None
但是如果你想按照你在问题中描述的方式行事,你可以这样做,
email_domains = ['@yahoo', '@gmail', '@live', '@outlook', '@hotmail', '@aol']
for e in email_domains:
if e in line:
locals()[e[1:]] = None
#if you use dict, use the below line
#my_dict[e[1:]] = None
locals()
返回当前命名空间的字典。此dict中的键是变量名称,value是变量的值。
因此locals()['gmail'] = None
创建一个名为gmail的局部变量(如果它不存在)并为其指定None
。
答案 1 :(得分:0)
正如您所述,并提供了示例文件:
所以我有两个解决方案:一线解决方案,另一个是详细的解决方案。
首先让我们定义正则表达式模式并导入重新模块
import re
pattern=r'.+@(?!gmail|yahoo|aol|hotmail|live|outlook).+'
现在详细的版本代码:
emails=[]
with open('emails.txt','r') as f:
for line in f:
match=re.finditer(pattern,line)
for find in match:
emails.append(find.group())
with open('result.txt','w') as f:
f.write('\n'.join(emails))
{p}输出result.txt
文件:
nic-os9@gmx.de
angelique.charuel@sfr.fr
nannik@interia.pl
l.andrioli@freenet.de
kamil_sieminski8@o2.pl
hugo.lebrun.basket@orange.fr
如果你想要太短的一线解决方案:
with open('results.txt','w') as file:
file.write('\n'.join([find.group() for line in open('emails.txt','r') for find in re.finditer(pattern,line)]))
输出:
nic-os9@gmx.de
angelique.charuel@sfr.fr
nannik@interia.pl
l.andrioli@freenet.de
kamil_sieminski8@o2.pl
hugo.lebrun.basket@orange.fr
P.S:使用一行解决方案文件不会自动关闭但python明确表示这不是一个大问题(但并非总是如此),但如果你想要,你仍然可以使用。