将变量的内容写入fi时发出

2024-05-16 21:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图获取一个SPF recordsdomains,域是从一个文件中读取的。当我试图获取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内容的领域,我得到它的文件,有什么建议请


Tags: 文件inimporttxtcom内容forinput
2条回答

尝试在with块中使用a generator expression,而不是常规的for循环:

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

这将一次获取所有行,对它们执行自定义的getspf操作,然后在它们之间添加新行

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

编辑:很小的疏忽,因为join需要一个字符串列表,所以每次都必须从getspf函数返回至少一个空字符串,而不是在不返回任何内容时默认为None

这是因为您一直在重写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"

相关问题 更多 >