我需要一个捷径

时间:2017-11-19 08:56:40

标签: python function

所以,我只是想制作一个简单的脚本,可以过滤不同域的电子邮件,它的工作很好,但我需要一个快捷方式,因为我不会写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()

2 个答案:

答案 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明确表示这不是一个大问题(但并非总是如此),但如果你想要,你仍然可以使用。