#python
#python
Вопрос:
Я хочу использовать имеющийся у меня здесь код для сопоставления доменов с их именем DNS-преобразователя
Текущий вывод CSV-файла
domain1 dns1 dns2 dns3 n domain2 dns1 dns2 dns3 n etc
Это неправильный формат, поскольку он добавляет все домены и преобразователи DNS в одну и ту же строку вместо новой строки, основанной на новом домене. Они разделены только пустой ячейкой из-за символа новой строки. Вместо этого я хочу, чтобы это было написано, как показано ниже, где каждый домен и его DNS-преобразователи записываются в свою отдельную строку.
Ожидаемый результат в формате CSV:
domain1 dns1 dns2 dns3
domain2 dns1 dns2 dns3
domain3 dns1 dns2 dns3
etc...
Я хочу, чтобы файл CSV был записан в правильном формате, и с помощью кода, который у меня есть, каждый раз, когда домен передается в def dns_resolver, он должен повторяться до нового индекса списка. таким образом, каждый домен и его преобразователи DNS имеют свой собственный список, поэтому при записи в новый файл CSV каждый домен будет напечатан в своей собственной строке в файле CSV.
Код неправильно выполняет итерацию по индексу списка и из-за этого не добавляет домен и его DNS-имена в какой-либо список. Когда все они записываются в один и тот же список, это работает нормально, но все они записываются в одну строку, что неверно. Поэтому вместо использования 1 списка я собираюсь использовать список списков и записать каждый в свой собственный список, а затем записать каждый список в файл csv, чтобы они были в своих собственных строках. Обычно домены будут считываться в список из файла CSV, но ради этого я ввел 3 значения.
import dns.resolver
import csv
import os
from os.path import dirname, abspath
r = 0
def dns_resolver(domain):
server = []
resolvers = []
try:
resolvers = dns.resolver.resolve(domain, 'NS')
#dns_list.append(domain)
for x in resolvers:
#dns_list.append(x.target)
#dns_list.append('n')
server.append(str(x.target))
except:
server.append('did not resolve')
finally:
return (domain, *server)
# Read in all domains from csv file domains.csv amp; count how many domains there are listed
domain_list = ['google.com', 'facebook.com', 'github.com']
domain_amount = 0
with open(domainFName, 'r') as file:
for line in csv.reader(file):
name = (line)
domain_list.append(line)
domain_amount = 1
for first_domain in domain_list:
for x in first_domain:
outputWriter.writerow(dns_resolver(x))
Комментарии:
1. В качестве отступления, пожалуйста, не используйте
exec(var " = X")
больше никогда =), ваше будущее «я» и мир будут вам благодарны
Ответ №1:
- Вы можете просто заставить свою функцию dns_resolver возвращать список для данного домена.
*server
это сокращение для добавления каждого элемента в список.- Используя понимание списка, соберите все списки в список списков для записи в CSV.
def dns_resolver(domain):
# do your dns resolution
# server = dns.resolver.resolve(domain, 'NS')
server = ["dns1", "dns2", "dns3", "dns4"]
return [domain, *server]
# Read in all domains
domain_list = ['google.com', 'facebook.com', 'github.com']
print([dns_resolver(d) for d in domain_list])
Вывод:
[
['google.com', 'dns1', 'dns2', 'dns3', 'dns4'],
['facebook.com', 'dns1', 'dns2', 'dns3', 'dns4'],
['github.com', 'dns1', 'dns2', 'dns3', 'dns4']
]
Комментарии:
1. Спасибо, небольшая настройка заставила это работать! Я обновил код, чтобы показать, что именно работает, но это было почти все!