2015-08-17 49 views
0

我试图获得的SPF records,并从域中读取文件。当我试图获取spf内容并将其写入文件并代码给了我从输入文件得到的最后一个域的结果。将变量的内容写入文件中的问题

Example `Input_Domains.txt` 

blah.com 
box.com 
marketo.com 

的输出,我得到的是只为marketo.com

#!/usr/bin/python 

import sys 
import socket 
import dns.resolver 
import re 


def getspf (domain): 
    answers = dns.resolver.query(domain, 'TXT') 
    for rdata in answers: 
    for txt_string in rdata.strings: 
     if txt_string.startswith('v=spf1'): 
     return txt_string.replace('v=spf1','') 

with open('Input_Domains.txt','r') as f: 
    for line in f: 
     full_spf=getspf(line.strip()) 
my_file=open("out_spf.txt","w") 
my_file.write(full_spf) 
my_file.close() 

我怎样才能解决这个写,我得到了它的文件域的所有内容SPF,有什么建议吗?

+0

您只执行一次写入,您希望如何获得除最后一项之外的任何内容? –

回答

3

这是因为你重写full_spf一切都是那么只有最后一个值存储在时间

with open('Input_Domains.txt','r') as f: 
    for line in f: 
     full_spf=getspf(line.strip()) 

修改:

with open('Input_Domains.txt','r') as f: 
    full_spf="" 
    for line in f: 
     full_spf+=getspf(line.strip())+"\n" 
2

尝试使用a generator expressionwith块内,而不是常规的for loop:

full_spf = '\n'.join(getspf(line.strip()) for line in f) 

这将一次抓取所有的行,对您的自定义getspf操作,然后用它们之间的换行符连接它们。

这样做的好处是,从概念上讲,您正在对数据进行单一转换。关于获取数据块并逐行处理数据,本质上并没有什么“循环”,因为它可以按任何顺序完成,所有行都是独立的。通过使用生成器表达式进行操作,可以将您的算法表示为单个转换和分配操作。

编辑:小疏忽,因为join需要字符串列表,你必须从你的getspf功能在任何情况下至少返回一个空字符串,而不是默认为None,当你不返回任何东西。