read_csv pandas函数的输入参数

7
我需要将使用Popen执行的一个命令的输出提供给pandas的read_csv函数。
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
pandas.read_csv(stdout,index_col=0)

但是显然stdout是一个字符串,它被解释为路径。在API文档中,它说“任何具有read()方法的对象(例如文件句柄或StringIO)”都可以作为read_csv函数的输入。我如何从Popen命令中获取这样的对象?最终目标是不写入磁盘。

当我将stdout的内容写入磁盘时,我可以看到csv每行都有双引号。

alvarobrandon$ head csvfile.csv
"1507109453,<,java,12447,a3e9c495869d,docker,9.0.4.130,9.0.2.131,9.0.2.131,9.0.4.130,56182,9092,9092,56182,tcp"
"1507109453,<,java,1244,a3e9c495869d,docker,9.0.4.130,9.0.2.131,9.0.2.131,9.0.4.130,56182,9092,9092,56182,tcp"
"1507109453,<,java,12447,a3e9c495869d,docker,9.0.4.130,9.0.2.131,9.0.2.131,9.0.4.130,56182,9092,9092,56182,tcp"
1个回答

5
您需要做的是从标准输出读取数据,并将该数据存储到类似文件的StringIO对象中。这里是一个最小化的工作示例。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import io
import subprocess
import pandas

cmd = ('cat', '/tmp/csvfile')
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
csv = io.StringIO(process.stdout.read().decode())
data = pandas.read_csv(csv, index_col=0)
csv.close()

希望这能帮到你!
编辑(输出实际上不是CSV格式,因此我们需要在解析之前对其进行清理):
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import io
import subprocess
import pandas

cmd = ('cat', '/tmp/csvfile')
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
csv = io.StringIO()
for line in process.stdout:
    csv.write(line.decode().strip('"\n') + '\n')
csv.seek(0)
data = pandas.read_csv(csv, index_col=0)
csv.close()

将字节转换为文本 - Bart Van Loon
似乎正在处理换行符 \n,因为我得到了一个1847941行x0列的pandas数据帧,其中所有信息都作为索引。 - Brandon
这对我来说似乎更像是一个分隔符问题;请查看read_csvsep参数。 - Bart Van Loon
我也尝试了 sep=',' 但是没有成功。我想给你一个提示,就是当输出转储为 csv 格式时,它会出现双引号。我将更新问题以反映这一点。 - Brandon
1
啊,我明白了。这个输出不是CSV格式的。如果你无法控制生成此输出的命令,那么你需要在Python中处理它。我会相应地更新答案。 - Bart Van Loon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接