Python 我需要一条捷径

Python 我需要一条捷径,python,function,Python,Function,因此,我只是想做一个简单的脚本,可以过滤不同域的电子邮件它的工作很好,但我需要一个快捷方式,因为我不想写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

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

我建议您对此使用
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中的键是变量名,值是变量的值


因此,
locals()['gmail']=None
创建一个名为gmail的局部变量(如果它不存在)并将其赋值为
None

,正如您所说的问题和提供的示例文件所示:

所以我有两个解决方案:一个是行解决方案,另一个是详细解决方案

首先,让我们定义regex模式并导入re模块

import re
pattern=r'.+@(?!gmail|yahoo|aol|hotmail|live|outlook).+'
现在提供详细的版本代码:

result.txt
文件中输出:

如果您想要太短,请使用单线解决方案:

输出:


注:一行解决方案文件不会自动关闭,但python明确指出,这不是一个大问题(但并不总是),但如果你想使用,你仍然可以使用。

既然你不使用yahoo、gmail、live、outlook或hotmail(变量),为什么要分配给它们?因为我想要其他域,我的意思是我想删除yahoo,gmail等我列表中的域…(还有变量),因为如果一个语句下没有任何内容,那么它会给我一个错误,这就是为什么我写yahoo=None“它工作得很好”是一种委婉的说法。所有以
@\u domain\u
开头的比较都一无所获,第二个
if
块过于复杂。此时,您可以将循环的全部内容简化为
good.write(line.strip(“”))
。你可以用正则表达式做3-4行,给我看看示例文件,这样我就可以帮你了。@AyodhyankitPaul什么地方的[e[1:]=None menas??是的,好多了。我没弄明白,你能写完整的代码吗
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))
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