我使用这个Python代码片段获得rabbitmq队列大小输出,它已经是csv格式,但是我需要知道如何将这个数据保存到文件中。
import subprocess
proc = subprocess.Popen("/usr/sbin/rabbitmqctl list_queues --formatter csv", shell=True, stdout=subprocess.PIPE)
stdout_value = proc.communicate()[0]
print stdout_value
我从这段代码中得到的输出
"name","messages"
"search_publish_queue","1"
.
.
我试着用with open
把输出写到一个csv文件中,它在每个字符旁边都写了。
import subprocess
import csv
with open('test.csv', 'w', ) as f:
writer = csv.writer(f)
proc = subprocess.Popen("/usr/sbin/rabbitmqctl list_queues --formatter csv", shell=True, stdout=subprocess.PIPE)
stdout_value = proc.communicate()[0]
writer.writerow(stdout_value)
它写入文件如下
",n,a,m,e,",",m,e,s,s,a,g,e,s,"
",s,e,a,r,c,h,_,p,u,b,l,i,s,h,_,q,u,e,u,e,",,,",1,"
怎么写呢?如果不使用
1条答案
按热度按时间r7s23pms1#
您面临的问题是writer. writerrow期望字段的可迭代对象作为单行写入。在本例中,stdout_value实际上是一个字节字符串,因此当您将其传递给writer.writerow时,该函数会尝试遍历每个字节,这会导致您看到的输出不正确。
有几种方法可以解决这个问题。一种方法是将stdout_value解码为常规字符串并将其直接写入文件。由于您的数据已经是CSV格式,因此您不需要在此特定情况下使用csv模块:
在这个例子中,我使用“文件”作为文件模式,直接向文件写入字节。我还将f作为stdout参数直接传递给Popen,这使它将输出直接写入文件。
或者,如果您仍然希望先将数据读入变量,则可以执行以下操作:
在本例中,我使用了“写入”模式来写入字节。注意,stdout_value是一个bytes对象,所以我们可以直接将其写入以二进制模式打开的文件(“文件”)。希望这对你有帮助!