2016-03-23 4 views
0

Я пытаюсь выполнить nslookup для адресов в файле adrese.txt, и я хотел бы сохранить их как .csv. В настоящее время моя самая большая проблема заключается в том, что он только nslookup только для одного адреса, а не для всех. Он просто выходит с 0, и в моем файле есть только один адрес. Я новичок в python и понятия не имею, как это исправить. Также было бы неплохо заменить также .txt csv в выходном файле.У меня есть список адресов, которые мне нужны для nslookup и отправить в csv

редактировать: адрес получения из текстового файла работает, вторая часть является проблемой, не знаю, почему

import subprocess 

f = open("adrese.txt") 
next = f.read() 
ip=[] 

while next != "": 
    ip.append(next) 
    next = f.read() 
file_ = open('nslookup.txt', 'w') 
for i in ip: 
    process = subprocess.Popen(["nslookup", i], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    output = process.communicate()[0] 
    file_.write(output) 
file_.close() 
+0

Вместо NSLOOKUP, попробуйте [dnspython] (http://www.dnspython.org/) – paj28

ответ

0

Причина, почему его делать это, потому что while next != "" не делать то, что вы хотите.

Вместо этого подумайте:

import subprocess 

with open('adrese.txt') as i, open('nslookup.txt', 'w') as o: 
    for line in i: 
    if line.strip(): # skips empty lines 
     proc = subprocess.Popen(["nslookup", line.strip()], 
           stdout=subprocess.PIPE, 
           stderr=subprocess.PIPE) 
     o.write('{}\n'.format(proc.communicate()[0])) 

print('Done') 
+0

спасибо, это сработало. Также работает мой адрес из файла, я проверил его с печатью, но проблема была во второй части кода, и я не знаю, почему –

0

Ваш фактически не зацикливание всех записей в вашем adrese.txt

ip = [] 
f = open("adrese.txt") 
for line in f: 
    ip.append(line) 
f.close() 

file_ = open('nslookup.txt', 'w') 
for i in ip: 
    process = subprocess.Popen(["nslookup", i], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    output = process.communicate()[0] 
    file_.write(output) 
file_.close() 
0

Вы можете использовать check_call и перенаправить стандартный вывод непосредственно в файл :

import subprocess 

with open('adrese.txt') as f, open('nslookup.txt', 'w') as out: 
    for line in map(str.rstrip, f): 
     if line: # skips empty lines 
      subprocess.check_call(["nslookup", line], 
            stdout=out) 

Вы никогда не пользуетесь STDERR так что нет смысла захватывать его, если они есть, не статус нулевого выхода вы можете поймать CalledProcessError:

import subprocess 

with open('adrese.txt') as f, open('nslookup.txt', 'w') as out: 
    for line in map(str.rstrip, f): 
     if line: # skips empty lines 
      try: 
       subprocess.check_call(["nslookup", line], 
             stdout=out) 
      except subprocess.CalledProcessError: 
       pass