【问题标题】:work through a file in python在 python 中处理文件
【发布时间】:2014-12-11 11:11:01
【问题描述】:

我是 python 新手,我正在尝试学习这个任务。我想从 DNS 区域文件中获取信息。 DNS 文件包含以下条目:

something 600 A 192.168.123.45
          600 A 192.168.123.46
someelse CNAME something
anotherone A 192.168.123.47
nextone CNAME anotherone
anotherone TXT ( "te asd as as d" )

目标是获取主机名,如果有对应的 TXT 条目,我也想获取该条目的信息。

所以我开始处理文件,如果我要描述条目,记录类型是 [2] 或 [1],紧随其后,我得到了 IP。所以我现在有这样的东西:

for line in data:
    word = line.split() 
    if len(word) > 2:
        if "CNAME" == word[2]:
            rectype = "CNAME"
             arecord = word[3].replace('.domain.com.', '')
            print rectype + " " + arecord
        if "CNAME" == word[1]:
            rectype = "CNAME"
             arecord = word[2].replace('.domain.com.', '')
            print rectype + " " + arecord
        if "A" == word[2]:
            rectype = "A"
            print rectype + " " + word[3]
        if "A" == word[1]:
            rectype = "A"
            print rectype + " " + word[2]

好的,到目前为止一切顺利.. 但是现在如果我想获得相应的 TXT 记录,我是否需要为每一行处理文档中的每一行,或者他们是否有更简单、更有效的方法来做到这一点?

【问题讨论】:

    标签: python dns


    【解决方案1】:

    Python 的部分优点在于您可以编写读起来像英语的代码,并且它使用直观的运算符。

    您有 很多 重复代码。在您的示例中,我们可以看到任何时候弹出“关键字”,例如ACNAME,然后您只需获取下一个令牌。在这里,我使用了in Python 关键字来检查元素是否在某种集合中。这是一个布尔值,所以如果它返回 true,那么我将采用下一个元素,即 tokens[tokens.index(keyword) + 1]

    同样,in 也可用于字符串和子字符串搜索。我检查“TXT”是否在当前行中,如果是,我假设你想要它后面的所有内容?我使用拼接运算符来指定范围。 line[line.index("TXT") + 3:] 表示我希望所有内容都在 索引 line.index("TXT") + 3 之后。

    KEYWORDS = ["CNAME", "A"]
    
    for line in data:
        tokens = line.split()
        if len(tokens) > 2:
            record = ""
            for keyword in KEYWORDS:
                if keyword in tokens:
                    record = keyword + " " + tokens[tokens.index(keyword) + 1]
    
            if "TXT" in line:
                txt_data = line[line.index("TXT") + 3:]
                record += "TXT: " + txt_data
    
            print record
    

    【讨论】:

    • 我已经认为所有这些 if 可以做得更优雅,但我想先得到一些结果。但是将两个字符串都放入关键字中,然后在 KEYWORDS 中询问关键字真的很好。我真的需要 zonefile.split() 吗?我的意思是在 zonefile 中为 line 做的事情不一样吗?关于 TXT,我想我不能相信 TXT 是在几行之前或之后的某个地方,无论它在文件的哪个位置,我都必须找到匹配的 TXT 条目。
    • 请提供一个示例,说明 TXT 条目的不同用途。并忽略 zonefile 拆分。我将您的数据复制粘贴到一个长字符串中,并且需要一种方法来处理它。将被编辑。
    【解决方案2】:

    我建议您构建一个字典,其键是标识符(“anotherone”将是您的示例中的一个示例),其值是字符串(或者可能是字符串列表 - 我对 DNS 很生疏,不确定如果可能有多个)。

    当您遇到 CNAME 和 A 记录时,将标识符作为键添加到字典中,并将其对应的值初始化为空列表。然后,当您点击其中包含“TXT”的行时,在字典中查找该标识符并将该行添加为值。

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多