Python 我需要一条捷径
因此,我只是想做一个简单的脚本,可以过滤不同域的电子邮件它的工作很好,但我需要一个快捷方式,因为我不想写if和elif语句很多次,有人能告诉我如何写我的脚本与功能,以便将变得更短,更容易。。提前感谢,脚本如下: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
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