Добавление элементов в список списков — Python

#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. Спасибо, небольшая настройка заставила это работать! Я обновил код, чтобы показать, что именно работает, но это было почти все!