2014-12-16 6 views
2

Я пытаюсь создать простой сценарий удаления принтера в Python 3.4.1. Есть, вероятно, более простые способы сделать это, но это то, что у меня есть: я использую продукт от itertools, беря данные из двух текстовых файлов в каталоге - один из них - список серверов, один - список принтеров.Проблемы с интервалом в выходном файле - использование продукта itertools для циклирования с использованием переменных из двух разных текстовых файлов для вывода на третий

код я прямо сейчас:

import webbrowser 
from itertools import product 
with open('servers.txt') as infile: 
    servers = infile.readlines() 
with open('PRINTERS_toDelete.txt') as infile: 
    queues = infile.readlines() 

strTemp1 = 'cscript c:\\windows\\system32\\prnmngr.vbs -d -p %s -s %s \n' 
with open('RUN_THIS.txt', 'w') as outfile: 
    outfile.writelines(strTemp1 % (queue,server) for queue,server in product(queues,servers)) 
webbrowser.open('RUN_THIS.txt') 

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

cscript c:\windows\system32\prnmngr.vbs -d -p queue1 
-s server1 

cscript c:\windows\system32\prnmngr.vbs -d -p queue1 
-s server2 

cscript c:\windows\system32\prnmngr.vbs -d -p queue1 
-s server3 
cscript c:\windows\system32\prnmngr.vbs -d -p queue2 
-s server1 

cscript c:\windows\system32\prnmngr.vbs -d -p queue2 
-s server2 

cscript c:\windows\system32\prnmngr.vbs -d -p queue2 
-s server3 
cscript c:\windows\system32\prnmngr.vbs -d -p queue3 
-s server1 

cscript c:\windows\system32\prnmngr.vbs -d -p queue3 
-s server2 

cscript c:\windows\system32\prnmngr.vbs -d -p queue3 
-s server3 
cscript c:\windows\system32\prnmngr.vbs -d -p iHatePrinters -s server1 

cscript c:\windows\system32\prnmngr.vbs -d -p iHatePrinters -s server2 

cscript c:\windows\system32\prnmngr.vbs -d -p iHatePrinters -s server3 

, где он должен выглядеть следующим образом:

cscript c:\windows\system32\prnmngr.vbs -d -p queue1 -s server1 
cscript c:\windows\system32\prnmngr.vbs -d -p queue1 -s server2 
cscript c:\windows\system32\prnmngr.vbs -d -p queue1 -s server3 

cscript c:\windows\system32\prnmngr.vbs -d -p queue2 -s server1 
cscript c:\windows\system32\prnmngr.vbs -d -p queue2 -s server2 
cscript c:\windows\system32\prnmngr.vbs -d -p queue2 -s server3 

cscript c:\windows\system32\prnmngr.vbs -d -p queue3 -s server1 
cscript c:\windows\system32\prnmngr.vbs -d -p queue3 -s server2 
cscript c:\windows\system32\prnmngr.vbs -d -p queue3 -s server3 

cscript c:\windows\system32\prnmngr.vbs -d -p iHatePrinters -s server1 
cscript c:\windows\system32\prnmngr.vbs -d -p iHatePrinters -s server2 
cscript c:\windows\system32\prnmngr.vbs -d -p iHatePrinters -s server3 

В принципе, существует ненужный разрыв строки между очередью и записью сервера. Также последняя запись кажется прекрасной (или, по крайней мере, лучше) предыдущей, поэтому я думаю, что она имеет какое-то отношение к тому, как она интерпретирует жесткий возврат в каждом из входных файлов. Дополнительное форматирование без пробелов для одной очереди на разных серверах и дополнительный разрыв строки между очередями будет идеальным, но не необходимым.

Я попытался немного поиграть, но не повезло - никаких мыслей?

ответ

1

Это происходит потому, что метод readlines сохраняет окончательный \ n в каждой строке файла, который вы читаете. Попробуйте это.

import webbrowser 
from itertools import product 
with open('servers.txt') as infile: 
    servers = list(map(str.strip, infile.readlines())) 
with open('PRINTERS_toDelete.txt') as infile: 
    queues = list(map(str.strip,infile.readlines())) 
strTemp1 = 'cscript c:\\windows\\system32\\prnmngr.vbs -d -p %s -s %s\n' 
with open('RUN_THIS.txt', 'w') as outfile: 
    outfile.writelines(strTemp1 % (queue,server) for queue,server in product(queues,servers)) 
webbrowser.open('RUN_THIS.txt') 
+0

ах, так что я должен был использовать карту и полосу там, хорошо. Спасибо, работает как шарм! – CharlieTango92

1

Вот что я хотел бы сделать:

map(str.strip, servers) #These lines remove any extra whitespace from reading the data 
map(str.strip, queues) 

strTemp1 = 'cscript c:\\windows\\system32\\prnmngr.vbs -d -p %s -s %s \n' 

with open('RUN_THIS.txt', 'w') as outfile: 
    for q in queues: 
     for s in servers: 
      outfile.write(strTemp1 % (queue,server)) 
     outfile.write("\n") 
+0

Это похоже на очень приятное, разумное решение, но я получаю трассировку/сообщение об ошибке «полоса» не определена. Мой код приведен ниже: 'import webbrowser с открытым ('servers.txt') в качестве infile: servers = infile.readlines() с открытым ('PRINTERS_toDelete.txt') как infile: queues = infile.readlines() карта (полоса, серверы) #remove whitespace from infiles карта (полоса, очереди) ' – CharlieTango92

+0

@ CharlieTango92, извините, ленивый ввод с моей стороны, см. Обновленный ответ – wnnmaw

+0

ах там мы идем, спасибо! – CharlieTango92

1

Вы пробовали что-то вроде этого?

with open('RUN_THIS.txt', 'w') as outfile: 
    for line in (strTemp1 % (queue,server) for queue,server in product(queues,servers))): 
     outfile.write(line.replace('\n','')) 
     outfile.write('\n')