输出文件的间距有问题 - 使用 itertools 产品循环使用来自两个不同文本文件的变量输出到第三个

Posted

技术标签:

【中文标题】输出文件的间距有问题 - 使用 itertools 产品循环使用来自两个不同文本文件的变量输出到第三个【英文标题】:Having issues with spacing on output file - using itertools product for looping using variables from two different text files to output to a third 【发布时间】:2014-12-16 16:42:55 【问题描述】:

我正在尝试在 Python 3.4.1 中制作一个简单的打印机删除脚本。可能有更简单的方法可以做到这一点,但这就是我所拥有的:我正在使用来自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')

【讨论】:

啊,所以我应该在那里使用地图和条带,好吧。谢谢,就像一个魅力!【参考方案2】:

你尝试过这样的事情吗?

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')

【讨论】:

【参考方案3】:

我会这样做:

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")

【讨论】:

这似乎是一个非常好的、理智的解决方案,但我得到了一个未定义的回溯/错误名称“strip”。我的代码如下:import webbrowser with open('servers.txt') as infile: servers = infile.readlines() with open('PRINTERS_toDelete.txt') as infile: queues = infile.readlines() map(strip, servers) #remove whitespace from infiles map(strip, queues) @CharlieTango92,抱歉,我懒惰打字,请参阅更新的答案

以上是关于输出文件的间距有问题 - 使用 itertools 产品循环使用来自两个不同文本文件的变量输出到第三个的主要内容,如果未能解决你的问题,请参考以下文章

UIToolbar 上的按钮间距

使用 itertools 将列表拆分为递增的序列

按数字顺序排列 itertools 产品

如何从 Python itertools 输出中删除字符串引号、逗号和括号?

如何在 itertools.accumulate 中使用初始参数?

如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()