rabbitmq 如何在python中将输出保存为csv文件

zkure5ic  于 12个月前  发布在  RabbitMQ
关注(0)|答案(1)|浏览(148)

我使用这个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,"

怎么写呢?如果不使用

r7s23pms

r7s23pms1#

您面临的问题是writer. writerrow期望字段的可迭代对象作为单行写入。在本例中,stdout_value实际上是一个字节字符串,因此当您将其传递给writer.writerow时,该函数会尝试遍历每个字节,这会导致您看到的输出不正确。
有几种方法可以解决这个问题。一种方法是将stdout_value解码为常规字符串并将其直接写入文件。由于您的数据已经是CSV格式,因此您不需要在此特定情况下使用csv模块:

import subprocess

with open('test.csv', 'wb') as f:
    proc = subprocess.Popen("/usr/sbin/rabbitmqctl list_queues --formatter csv", shell=True, stdout=f)
    proc.communicate()

在这个例子中,我使用“文件”作为文件模式,直接向文件写入字节。我还将f作为stdout参数直接传递给Popen,这使它将输出直接写入文件。
或者,如果您仍然希望先将数据读入变量,则可以执行以下操作:

import subprocess

proc = subprocess.Popen("/usr/sbin/rabbitmqctl list_queues --formatter csv", shell=True, stdout=subprocess.PIPE)
stdout_value = proc.communicate()[0]

with open('test.csv', 'wb') as f:
    f.write(stdout_value)

在本例中,我使用了“写入”模式来写入字节。注意,stdout_value是一个bytes对象,所以我们可以直接将其写入以二进制模式打开的文件(“文件”)。希望这对你有帮助!

相关问题